mirror of
https://github.com/nonebot/nonebot2.git
synced 2025-02-20 17:46:51 +08:00
Add permission
This commit is contained in:
parent
19c211b253
commit
998d5b327b
@ -1,4 +1,5 @@
|
|||||||
import os
|
import os
|
||||||
|
import sys
|
||||||
import importlib
|
import importlib
|
||||||
import logging
|
import logging
|
||||||
import re
|
import re
|
||||||
@ -9,6 +10,11 @@ from aiocqhttp import CQHttp
|
|||||||
from aiocqhttp.message import Message
|
from aiocqhttp.message import Message
|
||||||
|
|
||||||
logger = logging.getLogger('none')
|
logger = logging.getLogger('none')
|
||||||
|
default_handler = logging.StreamHandler(sys.stdout)
|
||||||
|
default_handler.setFormatter(logging.Formatter(
|
||||||
|
'[%(asctime)s] %(levelname)s: %(message)s'
|
||||||
|
))
|
||||||
|
logger.addHandler(default_handler)
|
||||||
|
|
||||||
from .plugin import handle_message, handle_notice, handle_request
|
from .plugin import handle_message, handle_notice, handle_request
|
||||||
from .command import on_command
|
from .command import on_command
|
||||||
|
@ -1,7 +1,8 @@
|
|||||||
import re
|
import re
|
||||||
from typing import Tuple, Union, Callable, Iterable, Dict, Any, Optional
|
from typing import Tuple, Union, Callable, Iterable, Dict, Any, Optional
|
||||||
|
|
||||||
from aiocqhttp import CQHttp
|
from aiocqhttp import CQHttp, Error as CQHttpError
|
||||||
|
from aiocqhttp.message import Message
|
||||||
|
|
||||||
from . import permissions as perm
|
from . import permissions as perm
|
||||||
|
|
||||||
@ -29,7 +30,34 @@ class Command:
|
|||||||
async def run(self, bot, ctx, session,
|
async def run(self, bot, ctx, session,
|
||||||
*args, **kwargs) -> Any:
|
*args, **kwargs) -> Any:
|
||||||
# TODO: check permission
|
# TODO: check permission
|
||||||
if isinstance(self.func, Callable):
|
permission = 0
|
||||||
|
if ctx['user_id'] in bot.config.SUPERUSERS:
|
||||||
|
permission |= perm.IS_SUPERUSER
|
||||||
|
if ctx['message_type'] == 'private':
|
||||||
|
if ctx['sub_type'] == 'friend':
|
||||||
|
permission |= perm.IS_PRIVATE_FRIEND
|
||||||
|
elif ctx['sub_type'] == 'group':
|
||||||
|
permission |= perm.IS_PRIVATE_GROUP
|
||||||
|
elif ctx['sub_type'] == 'discuss':
|
||||||
|
permission |= perm.IS_PRIVATE_DISCUSS
|
||||||
|
elif ctx['sub_type'] == 'other':
|
||||||
|
permission |= perm.IS_PRIVATE_OTHER
|
||||||
|
elif ctx['message_type'] == 'group':
|
||||||
|
permission |= perm.IS_GROUP_MEMBER
|
||||||
|
if not ctx['anonymous']:
|
||||||
|
try:
|
||||||
|
member_info = await bot.get_group_member_info(**ctx)
|
||||||
|
if member_info:
|
||||||
|
if member_info['role'] == 'owner':
|
||||||
|
permission |= perm.IS_GROUP_OWNER
|
||||||
|
elif member_info['role'] == 'admin':
|
||||||
|
permission |= perm.IS_GROUP_ADMIN
|
||||||
|
except CQHttpError:
|
||||||
|
pass
|
||||||
|
elif ctx['message_type'] == 'discuss':
|
||||||
|
permission |= perm.IS_DISCUSS
|
||||||
|
|
||||||
|
if isinstance(self.func, Callable) and permission & self.permission:
|
||||||
return await self.func(bot, ctx, session)
|
return await self.func(bot, ctx, session)
|
||||||
return None
|
return None
|
||||||
|
|
||||||
@ -48,11 +76,13 @@ def _find_command(name: Tuple[str]) -> Optional[Command]:
|
|||||||
|
|
||||||
|
|
||||||
class Session:
|
class Session:
|
||||||
__slots__ = ('cmd', 'arg', 'images', 'data', 'last_interaction')
|
__slots__ = ('cmd', 'arg', 'arg_text',
|
||||||
|
'images', 'data', 'last_interaction')
|
||||||
|
|
||||||
def __init__(self, cmd: Command, arg: str = ''):
|
def __init__(self, cmd: Command, arg: str = ''):
|
||||||
self.cmd = cmd
|
self.cmd = cmd
|
||||||
self.arg = arg
|
self.arg = arg
|
||||||
|
self.arg_text = Message(arg).extract_plain_text()
|
||||||
self.images = []
|
self.images = []
|
||||||
self.data = {}
|
self.data = {}
|
||||||
self.last_interaction = None
|
self.last_interaction = None
|
||||||
@ -60,7 +90,7 @@ class Session:
|
|||||||
|
|
||||||
async def handle_command(bot: CQHttp, ctx: Dict[str, Any]) -> bool:
|
async def handle_command(bot: CQHttp, ctx: Dict[str, Any]) -> bool:
|
||||||
# TODO: check if there is a session
|
# TODO: check if there is a session
|
||||||
msg_text = ctx['message'].extract_plain_text().lstrip()
|
msg_text = str(ctx['message']).lstrip()
|
||||||
|
|
||||||
for start in bot.config.COMMAND_START:
|
for start in bot.config.COMMAND_START:
|
||||||
if isinstance(start, type(re.compile(''))):
|
if isinstance(start, type(re.compile(''))):
|
||||||
@ -98,7 +128,7 @@ async def handle_command(bot: CQHttp, ctx: Dict[str, Any]) -> bool:
|
|||||||
if not cmd:
|
if not cmd:
|
||||||
return False
|
return False
|
||||||
|
|
||||||
session = Session(cmd, ''.join(cmd_remained))
|
session = Session(cmd=cmd, arg=''.join(cmd_remained))
|
||||||
session.images = [s.data['url'] for s in ctx['message']
|
session.images = [s.data['url'] for s in ctx['message']
|
||||||
if s.type == 'image' and 'url' in s.data]
|
if s.type == 'image' and 'url' in s.data]
|
||||||
await cmd.run(bot, ctx, session)
|
await cmd.run(bot, ctx, session)
|
||||||
|
@ -1,4 +1,6 @@
|
|||||||
from typing import Dict, Any
|
from typing import Dict, Any, Union, List
|
||||||
|
|
||||||
|
from aiocqhttp import CQHttp, Error as CQHttpError
|
||||||
|
|
||||||
|
|
||||||
def context_source(ctx: Dict[str, Any]) -> str:
|
def context_source(ctx: Dict[str, Any]) -> str:
|
||||||
@ -10,3 +12,13 @@ def context_source(ctx: Dict[str, Any]) -> str:
|
|||||||
if ctx.get('user_id'):
|
if ctx.get('user_id'):
|
||||||
src += 'p%s' % ctx['user_id']
|
src += 'p%s' % ctx['user_id']
|
||||||
return src
|
return src
|
||||||
|
|
||||||
|
|
||||||
|
async def send(bot: CQHttp, ctx: Dict[str, Any],
|
||||||
|
message: Union[str, Dict[str, Any], List[Dict[str, Any]]],
|
||||||
|
*, ignore_failure: bool = True) -> None:
|
||||||
|
try:
|
||||||
|
await bot.send(ctx, message)
|
||||||
|
except CQHttpError:
|
||||||
|
if not ignore_failure:
|
||||||
|
raise
|
||||||
|
@ -10,3 +10,15 @@ GROUP_OWNER = 0x0400
|
|||||||
GROUP = 0x0F00
|
GROUP = 0x0F00
|
||||||
SUPERUSER = 0xF000
|
SUPERUSER = 0xF000
|
||||||
EVERYONE = 0xFFFF
|
EVERYONE = 0xFFFF
|
||||||
|
|
||||||
|
IS_PRIVATE_FRIEND = PRIVATE_FRIEND
|
||||||
|
IS_PRIVATE_GROUP = PRIVATE_GROUP
|
||||||
|
IS_PRIVATE_DISCUSS = PRIVATE_DISCUSS
|
||||||
|
IS_PRIVATE_OTHER = PRIVATE_OTHER
|
||||||
|
IS_PRIVATE = PRIVATE
|
||||||
|
IS_DISCUSS = DISCUSS
|
||||||
|
IS_GROUP_MEMBER = GROUP_MEMBER
|
||||||
|
IS_GROUP_ADMIN = GROUP_MEMBER | GROUP_ADMIN
|
||||||
|
IS_GROUP_OWNER = GROUP_ADMIN | GROUP_OWNER
|
||||||
|
IS_GROUP = GROUP
|
||||||
|
IS_SUPERUSER = 0xFFFF
|
||||||
|
@ -1,6 +1,15 @@
|
|||||||
|
from aiocqhttp.message import unescape
|
||||||
|
|
||||||
import none
|
import none
|
||||||
|
from none import permissions as perm
|
||||||
|
from none.helpers import send
|
||||||
|
|
||||||
|
|
||||||
@none.on_command('echo', aliases=('say',))
|
@none.on_command('echo')
|
||||||
async def _(bot, ctx, session):
|
async def _(bot, ctx, session):
|
||||||
await bot.send(ctx, session.arg)
|
await send(bot, ctx, session.arg)
|
||||||
|
|
||||||
|
|
||||||
|
@none.on_command('say', permission=perm.SUPERUSER)
|
||||||
|
async def _(bot, ctx, session):
|
||||||
|
await send(bot, ctx, unescape(session.arg))
|
||||||
|
Loading…
x
Reference in New Issue
Block a user