Example #1
0
def on_raw_keyword(keyword: str, rule: Rule = None, **kwargs) -> Matcher:
    """Ensure the raw message contains the target keyword."""
    def raw_keyword(keyword: str) -> Rule:
        """Ensure the raw message contains the target keyword."""
        async def _raw_keyword(bot: Bot, event: Event, state: dict) -> bool:
            """Rule wrapper for raw_keyword."""
            return keyword in str(event.message)

        return Rule(_raw_keyword)

    return on_message(raw_keyword(keyword) & rule, **kwargs)
Example #2
0
        def decorator(func: Callable):
            matcher = on_message(rule=Rule(fullmatch_checker), **kwargs)

            @wraps(func)
            @self._pre_check(only_to_me=only_to_me)
            async def wrapper(bot: Bot, event: Event, state: T_State):
                await func(bot, event)
                logger.info(
                    f'消息{event.get_session_id()}已被on_fullmatch处理器{func.__name__}处理。'
                )

            matcher.handle()(wrapper)
Example #3
0
        def decorator(func: Callable):
            matcher = on_message(permission=msg_type, priority=9, **kwargs)

            @wraps(func)
            @self._pre_check(only_to_me=only_to_me)
            async def wrapper(bot: Bot, event: Event, state: T_State):
                await func(bot, event)
                logger.info(
                    f'消息{event.get_session_id()}已被on_message处理器{func.__name__}处理。'
                )
                await matcher.finish()

            return matcher.handle()(wrapper)
Example #4
0
def on_simple_command(cmd: str,
                      aliases: set = None,
                      rule: Rule = None,
                      **kwargs) -> Matcher:
    """Recognize a command that does not contain any parameters."""
    def simple_command(cmd: str, aliases: set = None) -> Rule:
        """Recognize a command that does not contain any parameters."""
        commands = set([cmd]) | (aliases or set())  # generate the commands

        async def _simple_command(bot: Bot, event: Event, state: dict) -> bool:
            """Rule wrapper for simple_command."""
            return str(event.message).strip() in commands

        return Rule(_simple_command)

    return on_message(simple_command(cmd, aliases) & rule, **kwargs)
Example #5
0
import re
from nonebot import on_message
from nonebot.typing import T_State
from nonebot.adapters.cqhttp.bot import Bot
from nonebot.adapters.cqhttp.event import GroupMessageEvent
from nonebot.adapters.cqhttp.permission import GROUP
from omega_miya.utils.Omega_plugin_utils import has_notice_permission
from .utils import sp_event_check

last_msg = {}
last_repeat_msg = {}
repeat_count = {}

repeater = on_message(rule=has_notice_permission(),
                      permission=GROUP,
                      priority=100,
                      block=False)


@repeater.handle()
async def handle_repeater(bot: Bot, event: GroupMessageEvent, state: T_State):
    group_id = event.group_id

    global last_msg, last_repeat_msg, repeat_count

    try:
        last_msg[group_id]
    except KeyError:
        last_msg[group_id] = ''
    try:
        last_repeat_msg[group_id]
Example #6
0
import re
from nonebot import on_message
from nonebot.exception import StopPropagation
from nonebot.adapters.cqhttp import Bot, MessageEvent

echo = on_message(priority=20, block=False)

REPEAT = 'repeat'

echo_maps = [{
    'reply':
    '确实。',
    'rules': ['不会真', '应该', '我是', '我就是', '这就是',
              re.compile('.是.[^??][??]$')]
}, {
    'reply':
    REPEAT,
    'rules': [
        re.compile('.*XM.*', re.IGNORECASE),
        re.compile('.*羡慕.*'),
        re.compile('.*YYDS.*', re.IGNORECASE),
    ]
}, {
    'reply': '我信了',
    'rules': [
        re.compile('flag', re.IGNORECASE),
    ]
}]


@echo.handle()
Example #7
0
from typing import Union

import nonebot
from loguru import logger
from nonebot import on_regex, on_command, on_message

from nonebot.adapters import Message, Event
from nonebot.adapters.onebot.v11 import Bot, MessageSegment, ActionFailed, GroupMessageEvent, PrivateMessageEvent
from .data_source import Pixiv, pixivlist, Q, pixiv_config, pixivhistory
from nonebot.matcher import Matcher
from nonebot.params import CommandArg
from nonebot.typing import T_State

pixiv = on_command("pixiv", aliases={"p"}, priority=2)
uixiv = on_command("u", aliases={"uid"}, priority=2)
pixiv_reply = on_message(priority=2)
pixiv_api = Pixiv()
cmd = list(nonebot.get_driver().config.command_start)[0]


@pixiv.handle()
async def pixiv_look(bot: Bot,
                     event: Union[GroupMessageEvent, PrivateMessageEvent],
                     args: Message = CommandArg()):
    args = args.__str__().split()
    if len(args) == 2:
        if args[0] in ["p", "pid", "id", "i", "P", "Pid", "PID"]:
            if pixiv_config.on_temp:
                info = pixivlist.search(Q["pid"] == int(args[1]))
                if info:
                    resp = info[0]["data"]
Example #8
0
from dataclasses import dataclass

from nonebot import on_message
from nonebot.params import Depends

test_depends = on_message()

runned = []


def dependency():
    runned.append(1)
    return 1


def parameterless():
    assert len(runned) == 0
    runned.append(1)


def gen_sync():
    yield 1


async def gen_async():
    yield 2


@dataclass
class ClassDependency:
    x: int = Depends(gen_sync)
Example #9
0
    r"^[\.。/#\:].*",
    r"^[\S+]$",
    r"^[\S+]$",
    r"此处消息的转义尚未被插件支持",
    r"请使用最新版手机QQ体验新功能",
]


def filter_msg(msg: str = EventPlainText()):
    for p in filter_patterns:
        if re.search(p, msg):
            return False
    return True


chat = on_message(rule=to_me(), block=True, priority=100)


@chat.handle()
async def first_receive(
    matcher: Matcher, event: MessageEvent, msg: str = EventPlainText()
):
    if event.reply:
        await chat.finish()
    if not filter_msg(msg):
        await chat.finish()

    if msg:
        reply = await get_reply(msg, event)
    else:
        reply = random.choice(null_reply)
Example #10
0
from random import choice

from nonebot import on_notice, on_message
from nonebot.adapters.onebot.v11.bot import Bot
from nonebot.adapters.onebot.v11.message import Message
from nonebot.adapters.onebot.v11.event import GroupMessageEvent, FriendRecallNoticeEvent, PokeNotifyEvent, GroupRecallNoticeEvent
from nonebot.rule import to_me

import src.plugins as cfg

poke = on_notice(rule=to_me())
recall = on_notice(priority=10)
flashimg = on_message(priority=10)


# 群聊撤回
@recall.handle()
async def _(bot: Bot, event: GroupRecallNoticeEvent):
    switch_map = cfg.check_switcher(event.group_id, '防撤回')
    if len(switch_map) == 0:
        return
    mid = event.message_id
    msg = await bot.get_msg(message_id=mid)
    if event.user_id != event.self_id and ',type=flash' not in msg['message']:
        re = '刚刚说了:\n' + msg['message']
        await recall.finish(message=Message(re), at_sender=True)


# 私聊撤回
@recall.handle()
async def _(bot: Bot, event: FriendRecallNoticeEvent):
Example #11
0
from nonebot import on_notice, on_message
from nonebot.adapters.cqhttp import GroupRecallNoticeEvent, Bot, Message, FriendRecallNoticeEvent, PokeNotifyEvent, \
    MessageEvent
from nonebot.rule import to_me
from random import choice

poke = on_notice(rule=to_me())
recall = on_notice()
flashimg = on_message()


# 群聊
@recall.handle()
async def _(bot: Bot, event: GroupRecallNoticeEvent):
    mid = event.message_id
    meg = await bot.get_msg(message_id=mid)
    if event.user_id != event.self_id and 'type=flash,' not in meg['message']:
        re = '刚刚说了:' + meg['message'] + '\n不要以为派蒙没看见!'
        await recall.finish(message=Message(re), at_sender=True)


# 私聊
@recall.handle()
async def _(bot: Bot, event: FriendRecallNoticeEvent):
    mid = event.message_id
    meg = await bot.get_msg(message_id=mid)
    if event.user_id != event.self_id and 'type=flash,' not in meg['message']:
        re = '刚刚说了:' + meg['message'] + '\n不要以为派蒙没看见!'
        await recall.finish(message=Message(re))

Example #12
0
from nonebot import (
    on_message, )
from nonebot.adapters.cqhttp import GroupMessageEvent, Message
from nonebot.adapters import Bot
from .model import (predict)

chat = on_message(priority=5, block=False)


@chat.handle()
async def _(bot: Bot, event: GroupMessageEvent):
    if str(event.group_id) in [
            "1098933683", "913211173", "993211173", "1124718762"
    ]:
        msg: Message = event.get_message()
        await chat.finish(predict(str(msg)))
Example #13
0
    recorder_obj.save_data()


@scheduler.scheduled_job("cron", day=1, hour=0, minute=0, second=0, id="clear_recorder")
async def clear_recorder():
    """每个月最后一天 24 点(下月 0 点)保存记录于历史记录文件夹,并重置记录"""
    recorder_obj.save_data_to_history()
    recorder_obj.init_data()
    logger.info("记录清除完成")


# endregion
# region 复读
repeat_message = on_message(
    rule=need_repeat,
    permission=GROUP,
    priority=5,
    block=True,
)


@repeat_message.handle()
async def repeat_message_handle(event: GroupMessageEvent):
    await repeat_message.finish(event.message)


repeat_cmd = repeat.command("basic", aliases={"repeat", "复读"}, permission=GROUP)
repeat_cmd.__doc__ = """
复读

查看当前群是否启用复读功能
/repeat
Example #14
0
from nonebot.adapters import Message, Event
from nonebot.adapters.onebot.v11 import Event, Bot, MessageSegment, ActionFailed, GroupMessageEvent, PrivateMessageEvent
import re

from nonebot.matcher import Matcher
from nonebot.params import Received, EventMessage, CommandArg, State, RegexGroup
from nonebot.typing import T_State

from .data_source import Ncm, music, ncm_config, playlist, setting, Q, cmd

set = on_command("ncm", priority=1, block=False)  # 功能设置
music_regex = on_regex("(song|url)\?id=([0-9]+)(|&)", priority=2,
                       block=False)  # 歌曲id识别 (新增json识别)
playlist_regex = on_regex("playlist\?id=([0-9]+)&", priority=2,
                          block=False)  # 歌单识别
music_reply = on_message(priority=2, block=False)  # 回复下载
search = on_regex("搜(歌|歌单|用户)", priority=2, block=False)  # 搜东西


@music_regex.handle()
async def music_receive(bot: Bot,
                        event: Event,
                        regroup: Tuple[Any, ...] = RegexGroup()):

    if event.dict()["message_type"] == "private":
        return await bot.send(event=event,
                              message=Message(
                                  MessageSegment.text("私聊无法启用解析功能")))
    info = setting.search(Q["group_id"] == event.dict()["group_id"])
    # logger.info(info)
    nid = regroup[1]
Example #15
0
from nonebot import on_message
from nonebot.typing import T_State
from nonebot.adapters.cqhttp import Bot, Event, Message, MessageSegment
from src.extensions.mongodb import MongoChat

from .config import Config

cfg = Config()
db = MongoChat()

record = on_message(priority=100, block=False)


@record.handle()
async def log2database(bot: Bot, event: Event, state: T_State):

    message_id = event.get_event_description().split()[1]
    session_id = event.get_session_id().split("_")

    if session_id[0] == 'group':
        group_id = session_id[1]
        user_id = session_id[2]
        self_id = None
        msg: Message[MessageSegment] = event.get_message()
    else:
        group_id = None
        user_id = session_id[0]
        self_id = bot.self_id
        msg: Message[MessageSegment] = event.get_message()

    await db.log_chat(msg, user_id, message_id, group_id, self_id)
Example #16
0
import re
import json
from nonebot import on_message
from nonebot.adapters.cqhttp import Bot, Event, Message, exception
from nonebot.log import logger
from nonebot.exception import StopPropagation
# from asyncstdlib.builtins import map as amap, list as alist
import aiohttp

from src.plugins.kit48.config import API_ROOT

bili_cover = on_message(priority=10, block=False)

reg = re.compile(r'https://www.bilibili.com/video/[0-9a-zA-Z]+')
short_reg = re.compile(r'https://b23.tv/[0-9a-zA-Z]+')


@bili_cover.handle()
async def handle_image(bot: Bot, event: Event, state: dict):
    message = str(event.get_message())

    short_result = short_reg.findall(message)
    short_links = list(set(short_result))
    # # https://stackoverflow.com/questions/62846735/how-to-use-await-inside-map-function
    # makeup_links = await alist(amap(get_target_link, short_links))

    result = reg.findall(message)
    links = list(filter(lambda link: type(link) == str, list(
        set(result)))) + short_links
    for link in links:
        info = await get_data(link)
Example #17
0
from epicteller.bot.controller import base
from epicteller.core.controller import message as message_ctl
from epicteller.core.controller import episode as episode_ctl
from epicteller.core.controller import room as room_ctl
from epicteller.core.model.character import Character
from epicteller.core.model.episode import Episode
from epicteller.core.model.message import TextMessageContent, ImageMessageContent, MessageContent
from epicteller.core.util import imghosting
from epicteller.core.util.enum import MessageType, ExternalType

VALID_MESSAGE_REGEX_PATTERN = r'^[^()()]'
VALID_MESSAGE_REGEX = re.compile(VALID_MESSAGE_REGEX_PATTERN)

say = on_message(rule=regex(VALID_MESSAGE_REGEX_PATTERN),
                 permission=permission.GROUP,
                 priority=99999)


@say.handle()
async def _(bot: Bot, event: MessageEvent, state: dict):
    await prepare(bot, event, state)
    episode: Episode = state.get('episode')
    character: Character = state.get('character')
    message_type: MessageType = state.get('message_type')
    content: MessageContent = state.get('content')
    is_gm: bool = state.get('is_gm')

    message = await message_ctl.create_message(episode, character,
                                               message_type, content, is_gm)
    internal_message_id = event.message_id
Example #18
0
    except error.combat.CombatOrderEmptyError:
        await combat_cmd.finish('❌ 先攻列表为空,无法进入下一行动轮。')
        return


async def combat_end(bot: Bot, event: MessageEvent, state: dict):
    combat: Combat = state['combat']
    try:
        await combat_ctl.end_combat(combat)
    except error.combat.CombatEndedError:
        await combat_cmd.finish('❌ 当前战斗已结束。')
        return


next_token = on_message(rule=regex(r'^\s*(回合结束|行动结束)\s*$'),
                        permission=permission.GROUP,
                        priority=99998,
                        block=True)


@next_token.handle()
async def _(bot: Bot, event: MessageEvent, state: dict):
    await prepare_combat_context(next_token, bot, event, state)
    combat: Combat = state['combat']
    if not combat or combat.state != CombatState.RUNNING:
        return
    is_gm: bool = state['is_gm']
    character: Optional[Character] = state['character']
    if not is_gm:
        if not character:
            return
        token = combat.tokens[combat.order.current_token_name]
Example #19
0
from nonebot import (
    on_message,
)
from nonebot.adapters.cqhttp import GroupMessageEvent, MessageSegment, Message
from nonebot.adapters import Bot
from aredis import StrictRedis

redis_client = StrictRedis(host='localhost', port=6379, decode_responses=True, db=1)


save_chat_data = on_message(priority=5, block=False)


@save_chat_data.handle()
async def _(bot: Bot, event: GroupMessageEvent):
    msg: Message = event.get_message()
    for item in msg:
        if item.type == 'text':
            group_id = str(event.group_id)
            with open(f'/var/www/chat_data/{group_id}_chat.log', 'a+') as file:
                if not await redis_client.exists(group_id):
                    await redis_client.set(group_id, True)
                    file.write("\n")
                file.write(f"{item.data.get('text')}\n")
                await redis_client.expire(group_id, 60)

Example #20
0
trigger = {}  #重复触发词判定
data = {}  #语料数据
ptalk = {}  #群回复率
focus_id = []  #特别对象

gpath = os.path.dirname(__file__)
path = gpath + '/data.json'
with open(path) as f:
    data = json.load(f)


def union(gid, uid):
    return (gid << 32) | uid


chat = on_message(priority=99)


@chat.handle()
async def _(bot: Bot, event: GroupMessageEvent):
    message = str(event.raw_message)
    print(message)
    group_id = event.group_id
    user_id = event.user_id

    global ptalk
    ptalk.setdefault(group_id, 1)
    trigger.setdefault(group_id, ' ')

    for i in data:
        if i in message:
Example #21
0
from nonebot import on_message
from nonebot.adapters.cqhttp import Bot, MessageEvent
from nonebot.log import logger

# 展示所有接收到的信息,比如方便测试 QQ 表情等特殊消息的数据结构
print_plugin = on_message(priority=1, block=False)


@print_plugin.handle()
async def handle_print(bot: Bot, event: MessageEvent, state: dict):
    message = str(event.get_message())
    logger.info(f'receive message: {message}')
Example #22
0
import asyncio

from nonebot import on_message
from nonebot.permission import USER
from nonebot.typing import Bot, Event

a = on_message(priority=0, permission=USER(123123123), temp=True)


@a.handle()
async def test_a(bot: Bot, event: Event, state: dict):
    print("======== A Received ========")
    print("======== A Running Completed ========")


b = on_message(priority=0, permission=USER(123456789), temp=True)


@b.handle()
async def test_b(bot: Bot, event: Event, state: dict):
    print("======== B Received ========")
    await asyncio.sleep(10)
    print("======== B Running Completed ========")


c = on_message(priority=0, permission=USER(1111111111))


@c.handle()
async def test_c(bot: Bot, event: Event, state: dict):
    print("======== C Received ========")
Example #23
0
from nonebot import on_message
from math import exp
from random import random
from nonebot.adapters.cqhttp import Bot, Event

repeat = on_message(priority=5)

tjmp = {}


def sigmoid(num):
    num //= 2
    if num < 1:
        return -1
    num -= 3
    print(1 / (1 + exp(-num)))
    return 1 / (1 + exp(-num))


@repeat.handle()
async def firsthandle(bot: Bot, event: Event, state: dict):
    msg = str(event.message).strip()
    global tjmp
    if event.detail_type != "group":
        return
    if event.group_id not in tjmp:
        tjmp[event.group_id] = [0, "", "", 0]
    now = tjmp[event.group_id]
    try:
        if msg == now[2]:
            now[0] += 1
Example #24
0
import asyncio

from nonebot import on_message
from nonebot.typing import T_State
from nonebot.permission import USER
from nonebot.adapters import Bot, Event

a = on_message(priority=0, permission=USER("123123123"), temp=True)


@a.handle()
async def test_a(bot: Bot, event: Event, state: T_State):
    print("======== A Received ========")
    print("======== A Running Completed ========")


b = on_message(priority=0, permission=USER("123456789"), temp=True)


@b.handle()
async def test_b(bot: Bot, event: Event, state: T_State):
    print("======== B Received ========")
    await asyncio.sleep(10)
    print("======== B Running Completed ========")


c = on_message(priority=0, permission=USER("1111111111"))


@c.handle()
async def test_c(bot: Bot, event: Event, state: T_State):
Example #25
0
    if status_config.server_status_cpu:
        data.append(f"CPU: {int(cpu_status()):02d}%")

    if status_config.server_status_memory:
        data.append(f"Memory: {int(memory_status()):02d}%")

    if status_config.server_status_disk:
        data.append(f"Disk:\n" + "\n".join(
            f"  {k}: {int(v.percent):02d}%" for k, v in disk_usage().items()))

    await matcher.send(message="\n".join(data))


async def _group_poke(bot: Bot, event: Event, state: T_State) -> bool:
    return isinstance(event, PokeNotifyEvent) and str(
        event.user_id) in global_config.superusers


group_poke = on_notice(_group_poke, priority=10, block=True)
group_poke.handle()(server_status)


async def _poke(bot: Bot, event: Event, state: T_State) -> bool:
    return (isinstance(event, PrivateMessageEvent) and
            event.sub_type == "friend" and event.message[0].type == "poke")


poke = on_message(_poke, permission=SUPERUSER, priority=10)
poke.handle()(server_status)
Example #26
0
import time
import os

from nonebot import on_message
from nonebot.adapters import Event, Bot
from nonebot.adapters.cqhttp import PrivateMessageEvent

from .sqlite import is_logging, start_logging, stop_logging
from .s3 import upload_file

TRPGLogger = on_message(priority=1, block=False)


@TRPGLogger.handle()
async def _(bot: Bot, event: Event):
    message = str(event.get_message()).strip()
    if isinstance(event, PrivateMessageEvent):
        return
    if message[:4] == '.log':
        if isinstance(event, PrivateMessageEvent):
            await bot.send(event, "暂不支持")
            return
        if message[4:].strip() == 'on' or message[4:].strip() == '':
            if is_logging(event.group_id):
                await bot.send(event, "正在进行日志记录, 无法再次开始!")
            else:
                await bot.send(event, "开始日志记录")
                start_logging(event.group_id, event.time)
        elif message[4:].strip() == 'off':
            file_path = os.path.join(
                'data', 'trpglogger',
Example #27
0
import httpx
import io
from nonebot import (
    on_message, )
from nonebot.adapters import Bot
from nonebot.adapters.cqhttp import MessageEvent, GroupMessageEvent
from nonebot.adapters.cqhttp.message import MessageSegment
from PIL import Image
from .data_source import predict
from typing import Dict, List

recognition = on_message(priority=5)


@recognition.handle()
async def _(bot: Bot, event: GroupMessageEvent):
    msg: MessageSegment = event.get_message().pop()
    if msg.type == "image":
        async with httpx.AsyncClient() as client:
            image = await client.get(msg.data['url'])
            im = Image.open(io.BytesIO(image.content))
            pre: List[Dict[str, float]] = predict(im)
            if not pre:
                return
            elif pre[0]["score"] > 0.9:
                await recognition.finish(f" 一定是 {pre[0]['name']} 拉")
                return
            elif pre[0]["score"] > 0.7:
                await recognition.finish(f"我猜是 {pre[0]['name']} ")
Example #28
0
from loguru import logger
from nonebot import on_command, on_message
from nonebot import on_regex
from nonebot.adapters.cqhttp import Bot, Event, Message, MessageSegment

from .data_source import Setu, hso_config
from .model import Power

# -----------
# 事件响应
# -----------

# -----------------------------------------------------------------
setu = on_regex(pattern="来(.*?)[点丶份张幅](.*?)的?(|r18)[色瑟涩🐍][图圖🤮]", priority=1)
db = on_command("hso", priority=2)
reply = on_message(priority=3)
pic = on_command("查看")
asyncio.run(Power().update_all())


@setu.receive()
async def message_receive(bot: Bot, event: Event, state: dict):  # 涩图调用
    # logger.info(bot.__dict__)
    # logger.info(event.dict())
    # logger.info(state)
    await Setu(bot, event, state).main()


# -----------------------------------------------------------------

Example #29
0
        await del_event.finish("我可不想忘记[CQ:face,id=14]")


list_event = on_command("list", rule=startswith("list"), priority=5)


@list_event.handle()
async def _(bot: Bot, event: MessageEvent):
    stripped_arg = event.raw_message.split()[1:]
    logger.debug(f"{stripped_arg}, {len(stripped_arg)}")
    if stripped_arg and len(stripped_arg) == 1:
        res = await redis_client.smembers(stripped_arg[0])
        await list_event.finish(f"{res}")


group = on_message(block=False, priority=5)


@group.handle()
async def _(bot: Bot, event: MessageEvent):
    msg: Message = event.get_message()

    for i in msg:
        if i.type == "image":
            return

    sentence = event.raw_message.strip()

    if sentence.split()[0] in [
            'add', 'list', 'del', 'help', 'info', 'jita', '签到', '兑换', '积分',
            '抽奖', '柏青哥', '积分池'
Example #30
0
from nonebot import on_message
from nonebot.matcher import Matcher
from nonebot.adapters import Event, Message
from nonebot.params import ArgStr, Received, EventMessage, LastReceived

test_handle = on_message()


@test_handle.handle()
async def handle():
    await test_handle.finish("send", at_sender=True)


test_got = on_message()


@test_got.got("key1", "prompt key1")
@test_got.got("key2", "prompt key2")
async def got(key1: str = ArgStr(), key2: str = ArgStr()):
    if key2 == "text":
        await test_got.reject("reject", at_sender=True)

    assert key1 == "text"
    assert key2 == "text_next"


test_receive = on_message()


@test_receive.receive()
@test_receive.receive("receive")