from nonebot.typing import T_State from .config import Config from .platform import check_sub_target, platform_manager from .scheduler import * from .types import Target from .utils import parse_text common_platform = [ p.platform_name for p in filter( lambda platform: platform.enabled and platform.is_common, platform_manager.values(), ) ] sub = CommandGroup("sub") # region 添加订阅 add_sub_cmd = sub.command("add", aliases={"添加订阅"}, permission=GROUP_ADMIN | GROUP_OWNER | SUPERUSER) add_sub_cmd.__doc__ = """ 订阅 仅允许群主与管理员操作 /添加订阅 """ @add_sub_cmd.handle() async def init_promote(event: GroupMessageEvent, state: T_State):
说明: 当bot加入新群组时, 请管理员【首先】使用"/更新群组信息"命令为bot录入当前群组信息 之后使用"/设置群组权限"为当前群组配置命令权限 仅允许本群组接收bot推送通知, 请配置"/设置群组权限 通知" 仅允许本群组使用bot命令, 请配置"/设置群组权限 命令" 同时允许本群组使用命令与接收bot推送通知, 请配置"/设置群组权限 通知 命令" 取消本群组所有权限请使用"/重置群组权限" 若需要使用"技能""请假"命令组 请管理员在更新群组信息之后【依次】执行"/更新用户信息""/更新群组成员列表" 并在新成员加入后同样执行上述命令 ''' manage = CommandGroup('Manage') @manage.command('refresh_member', aliases=('刷新用户信息', '更新用户信息'), only_to_me=False, permission=permission.SUPERUSER | permission.GROUP_ADMIN) async def refresh_member(session: CommandSession): try: __group_user_list = await session.bot.get_group_member_list( group_id=session.event.group_id) except Exception as e: log.logger.warning( f'{__name__}: 用户{session.event.user_id} 使用命令refresh_member时发生错误: {e}, 该命令需要在群组中使用' ) session.finish('请在群组内使用该命令!')
求签, 求运势, 包括且不限于抽卡、吃饭、睡懒觉、DD 每个人每天求同一个东西的结果是一样的啦! 不要不信邪重新抽啦! **Permission** Command & Lv.10 **Usage** /求签 [所求之事] /DD老黄历''' # Init plugin export init_export(export(), __plugin_name__, __plugin_usage__) # 注册事件响应器 Maybe = CommandGroup('maybe', rule=has_command_permission() & permission_level(level=10), permission=GROUP, priority=10, block=True) luck = Maybe.command('luck', aliases={'求签'}) # 修改默认参数处理 @luck.args_parser async def parse(bot: Bot, event: GroupMessageEvent, state: T_State): args = str(event.get_plaintext()).strip().lower().split() if not args: await luck.reject('你似乎没有发送有效的参数呢QAQ, 请重新发送:') state[state["_current_key"]] = args[0] if state[state["_current_key"]] == '取消': await luck.finish('操作已取消')
from app.libs.cache import cache @on_command("get_configs", aliases=["设置"], permission=perm.SUPERUSER) async def get_config(session: CommandSession): await session.send(f"{pprint.pformat(get_bot().config.__dict__, indent=2)}") @on_command("get_commands", aliases=["命令"], permission=perm.SUPERUSER) async def get_command(session: CommandSession): await session.send(f"{pprint.pformat(CommandManager._commands, indent=2)}") await session.send(f"{pprint.pformat(CommandManager._aliases, indent=2)}") cc = CommandGroup("cache", permission=perm.SUPERUSER) @cc.command("set") async def _(session: CommandSession): data = session.current_arg try: key, value = data.split() key = key.strip() value = value.strip() await cache.set(key, value) except Exception: await session.send("输入有误") @cc.command("get")
# coding=utf-8 from collections import UserDict from string import Formatter import requests import re import json import datetime import asyncio import chiharu.plugins.config as config from nonebot import on_command, CommandSession, CommandGroup, scheduler, get_bot seiyuu = CommandGroup('seiyuu', only_to_me=False) @seiyuu.command('today') @config.ErrorHandle async def GetSeiyuuToday(session: CommandSession): strout = await _GetSeiyuuToday() await session.send(strout, auto_escape=True) @seiyuu.command('check') @config.ErrorHandle async def CheckSeiyuu(session: CommandSession): name = session.get('name') count = session.get('count') loop = asyncio.get_event_loop() url = await loop.run_in_executor(None, requests.get, "https://sakuhindb.com/anime/search.asp?S_iC=%E6%96%87%E5%AD%97&ocs=euc&key=" + name + "&todo=%E6%83%85%E5%A0%B1DB") seiyuu = url.text.encode(url.encoding).decode("utf-8") pos = re.search("検索時間", seiyuu).span()[1] match = re.search("<a href\\=\"(https://sakuhindb.com/tj/[A-Za-z0-9_]*/)\">", seiyuu[pos:]) if match: if re.search("<a href\\=\"(https://sakuhindb.com/tj/[A-Za-z0-9_]*/)\">((?!CV|Cv).)*?</a>", seiyuu[pos + match.span()[1]:]):
from nonebot import CommandSession, CommandGroup from sql_exe import sql_exe from .live_state import * from .book_state import * from .push_live_info import * __plugin_name__ = '订阅' __plugin_usage__ = r"""订阅服务 目前仅支持: bilibili 指令: b订阅 / b取订 / b订阅列表""" cg = CommandGroup('subscription', only_to_me=False) @cg.command('j', aliases=['j订阅']) async def subscription_jj(session: CommandSession): bid = session.get('bid', prompt='请输入你要订阅的novel id') group_id = session.ctx.get('group_id') # 检查novel是否存在 state, book_info = await get_book_info(bid) if state == 2: session.finish('这本小说不存在') elif state == 1: session.finish('这本小说已经完结') # 验证是否已订阅 sql_select = ( 'SELECT live_id FROM subscription WHERE group_id=? AND platform = "jjwxc";'
from nonebot import (CommandGroup, CommandSession, NLPSession, logger, on_command, on_natural_language, permission) import sqlite3 import re from random import choice from hashlib import md5 # talk命令组 talk = CommandGroup('talk', shell_like=True) # TODO 自动配置数据库 # 连接数据库 database = sqlite3.connect('./teachabletalk.sqlite') cursor = database.cursor() def rule_exist(pattern: str, reply: str): check_SQL = '''SELECT * FROM rules WHERE pattern = ? AND reply = ?''' cursor.execute(check_SQL, (pattern, reply)) if cursor.fetchone(): return True else: return False def add_rule(pattern: str, reply: str): if rule_exist(pattern, reply): raise sqlite3.IntegrityError add_SQL = '''INSERT INTO rules (pattern, reply) VALUES (?, ?)''' cursor.execute(add_SQL, (pattern, reply))
from nonebot import CommandGroup from nonebot.adapters.onebot.v11 import Message, MessageEvent from nonebot.matcher import Matcher from nonebot.params import ArgPlainText, CommandArg, Depends from src.utils.helpers import strtobool from ..help.commands import get_command_help from .config import DATA, global_config, plugin_config from .fflogs_api import fflogs from .fflogs_data import FFLOGS_DATA from .gate import get_direction from .nuannuan import get_latest_nuannuan from .universalis_api import get_item_price ff14 = CommandGroup("ff14") # region 藏宝选门 gate_cmd = ff14.command("gate", aliases={"gate"}) gate_cmd.__doc__ = """ 最终幻想XIV 藏宝选门 选择门的数量 /gate 2 /gate 3 """ async def get_door_number(door_number: str = ArgPlainText()) -> int: """获取门的数量""" if not door_number:
from nonebot import CommandGroup __plugin_name__ = 'B站番剧指南' __plugin_usage__ = """ ------banned------ 关键字:"番", "动漫", "动画"【需要at】 触发示例: 最近有什么新番 18年7月有啥动漫 约会大作战什么时候更新 梦幻岛今天更新了吗 刀剑神域明天会更新嘛 ######################## """ cg = CommandGroup('anime_index') from . import index, timeline, nlp
from nonebot import (CommandSession, CommandGroup, on_natural_language, NLPSession, NLPResult) from nonebot.helpers import render_expression as __ from . import expressions as e __plugin_name__ = '天气' __plugin_usage__ = r""" 天气功能使用帮助 天气 [城市名称] """.strip() w = CommandGroup('weather') @w.command('weather', aliases=('天气', '天气预报')) async def weather(session: CommandSession): city = session.get('city', prompt=__(e.WHICH_CITY)) await session.send(__(e.REPORT, city=city)) @weather.args_parser async def _(session: CommandSession): striped_arg = session.current_arg_text.strip() if session.current_key: session.args[session.current_key] = striped_arg elif striped_arg: session.args['city'] = striped_arg
from nonebot import CommandGroup __plugin_name__ = 'Bilibili' cg = CommandGroup('bilibili_anime') from . import index, timeline, nlp
# 声明本插件可配置的权限节点 __plugin_auth_node__ = [ PluginCoolDown.skip_auth_node ] # 声明本插件的冷却时间配置 __plugin_cool_down__ = [ PluginCoolDown(__plugin_raw_name__, 'user', 1) ] # Init plugin export init_export(export(), __plugin_name__, __plugin_usage__, __plugin_auth_node__, __plugin_cool_down__) # 注册事件响应器 Draw = CommandGroup('draw', rule=has_command_permission() & permission_level(level=10), permission=GROUP, priority=10, block=True) deck = Draw.command('deck', aliases={'抽卡'}) # 修改默认参数处理 @deck.args_parser async def parse(bot: Bot, event: GroupMessageEvent, state: T_State): args = str(event.get_plaintext()).strip().lower().split() if not args: await deck.reject('你似乎没有发送有效的参数呢QAQ, 请重新发送:') state[state["_current_key"]] = args[0] if state[state["_current_key"]] == '取消': await deck.finish('操作已取消')
from nonebot import permission as perm from nonebot.command import call_command from nonebot.command.argfilter import (converters, extractors, validators, controllers) from nonebot.helpers import context_id from nana import scheduler from nana.command import allow_cancellation from nana.helpers import random_string from nana.scheduler import ScheduledCommand __plugin_name__ = '订阅' PLUGIN_NAME = 'subscribe' cg = CommandGroup('subscribe', permission=perm.PRIVATE | perm.GROUP_ADMIN | perm.DISCUSS) @cg.command('subscribe', aliases=['订阅', '添加订阅', '新增订阅', '新建订阅'], only_to_me=False) async def subscribe(session: CommandSession): message = session.get('message', prompt='你想订阅什么内容呢?', arg_filters=[ controllers.handle_cancellation(session), str.lstrip, validators.not_empty('请输入有效内容哦~'), ]) hour = session.state.get('hour')
'id INTEGER PRIMARY KEY AUTOINCREMENT,' 'user_id INT NOT NULL,' 'user_nickname TEXT NOT NULL,' 'user_card TEXT,' 'cards TEXT' ');') sql_exe(sql_init) except OperationalError: pass __plugin_name__ = '抽卡' __plugin_usage__ = """借用塔罗, 图一乐 指令: 单抽 / 十连 / 仓库""" cg = CommandGroup('_card', only_to_me=False) @cg.command('choice', aliases=['单抽']) async def card_choice(session: CommandSession): path = 'data/image' file_list = os.listdir(path) ch = random.choice(file_list) ch_id = ch.split('_')[0] sql = ('INSERT INTO draw VALUES (NULL, ?, ?, ?, ?);') ctx = session.ctx
from nonebot import CommandGroup, CommandSession from pyquery import PyQuery as pq from .data_source import * import random __plugin_name__ = 'scp' __plugin_usage__ = r"""scp查询 指令: scp""" cg = CommandGroup('scp', only_to_me=False) @cg.command('scp', aliases=['SCP', 'Scp', 'scp']) async def scp(session: CommandSession): q_type = session.get('type', prompt='最近翻译or最近原创or随机?') result_str = '' if q_type.find("原创") > -1: q_type_int = 0 elif q_type.find("翻译") > -1: q_type_int = 1 elif q_type.find("随机") > -1: q_type_int = 2 else: q_type_int = -1 if q_type_int == 0 or q_type_int == 1: scp_list = await get_latest_article(q_type_int, 1) for s in scp_list[:5]: result_str = result_str + s['title'] + '\nhttp://scp-wiki-cn.wikidot.com' + s['link'] + '\n创建于' \ + s['created_time'] + '\n评分' + s['rank'] + '\n' elif q_type_int == 2:
""" from nonebot import CommandGroup from coolqbot import PluginData __plugin_name__ = 'repeat' __plugin_usage__ = r""" 人类本质 用来模仿人类,同时提供排行榜,历史记录和记录复读状态功能。 例如: -------排行榜--------- /rank /rank 30n0 -------历史记录------- /history /history 2020-01 /history 2020-01-01 -------状态----------- /status 命令均需要在群里使用。 """.strip() cg = CommandGroup('repeat') DATA = PluginData('repeat', config=True) from . import commands, nlp
from nonebot import CommandGroup, CommandSession import random import shlex from .data_source import get_random_things __plugin_name__ = '随机' __plugin_usage__ = r"""有关随机 指令: 随机数 / 打乱 / 抽签 / 找点乐子""" cg = CommandGroup('random', only_to_me=False) @cg.command('number', aliases=['随机数']) async def random_number(session: CommandSession): argv = shlex.split(session.current_arg_text) start, end = 1, 100 try: if len(argv) == 1: start, end = 1, int(argv[0]) elif len(argv) > 1: start, end = int(argv[0]), int(argv[1]) except ValueError: session.finish('格式错误,随机数范围需是数字') start = min(start, end) end = max(start, end) if end > 10000 or start < -10000: session.pause('范围过大,请重新输入') await session.send(str(random.randint(start, end)))
from nonebot.rule import to_me from nonebot import CommandGroup, MatcherGroup cmd = CommandGroup("test", rule=to_me()) match = MatcherGroup(priority=2) from . import commands, matches
import random import shlex from nonebot import CommandGroup, CommandSession __plugin_name__ = '随机' cg = CommandGroup('random') @cg.command('number', aliases=['随机数']) async def random_number(session: CommandSession): argv = shlex.split(session.current_arg_text) start, end = 1, 100 try: if len(argv) == 1: start, end = 1, int(argv[0]) elif len(argv) > 1: start, end = int(argv[0]), int(argv[1]) except ValueError: session.finish('用法不对啦,随机数范围需要是数字哦') start = min(start, end) end = max(start, end) if end > 10000 or start < -10000: session.pause('范围太大啦,请重新输入') await session.send(str(random.randint(start, end))) @cg.command('shuffle', aliases=['打乱'])
import sqlite3 from sqlite3 import OperationalError from nonebot import CommandSession, CommandGroup from nonebot.permission import SUPERUSER from random import randint import time from plugins.group_admin import timestamp2date_string from sql_exe import sql_exe __plugin_name__ = '回应' __plugin_usage__ = r"""应激反应""" cg = CommandGroup('response', only_to_me=False) @cg.command('yyy', aliases=['嘤一下', '嘤一个', '来嘤']) async def response_yyy(session: CommandSession): await session.send('嘤嘤嘤') @cg.command('meow', aliases=['喵一下', '喵一个', '来喵']) async def response_meow(session: CommandSession): await session.send('喵~') @cg.command('kusa', aliases=['草']) async def response_kusa(session: CommandSession): if randint(1, 10) > 8:
from nonebot import CommandGroup, CommandSession import os import random from shutil import copyfile from .languages_image import LanguagesImage from .run_source import * __plugin_name__ = '代码' __plugin_usage__ = r"""在线运行代码 指令: languages_list / java_run""" cg = CommandGroup('code', only_to_me=False) @cg.command('languages_list', aliases=['languages_list', '语言列表', 'languages列表', 'list']) async def code_languages_list(session: CommandSession): text_out = ('Currently supported languages:\n' 'assembly ats bash c\n' 'clojure cobol coffeescript cpp\n' 'crystal csharp d elixir\n' 'elm erlang fsharp go\n' 'groovy haskell idris java\n' 'javascript julia kotlin lua\n' 'mercury nim ocaml perl\n' 'perl6 php python ruby\n' 'rust scala swift typescript') li = os.listdir('data/image') im = 'data/image/' + random.choice(li) img = LanguagesImage(im, text_out)
from nonebot import CommandGroup, CommandSession from nonebot.permission import SUPERUSER from aiocqhttp import MessageSegment from .data_source import * from ..chick_in import get_image from ..tips import cuprum cmd = ['色图', '涩图', '瑟图', '来张色图', '来张涩图', '来张瑟图'] __plugin_name__ = '希望' __plugin_usage__ = fr"""色图服务 暂不开放 指令: {' / '.join(cmd)}""" cg = CommandGroup('hope', only_to_me=False) @cg.command('random_hope', aliases=cmd, permission=SUPERUSER) async def hope_random_hope(session: CommandSession): bot = session.bot boo = await bot.can_send_image() boo = boo['yes'] if boo: await session.send('少女祈祷中...') hope_url = await get_random_hope() msg = f'[CQ:image,file={hope_url}]' await session.send(msg) else: await session.send('机器人暂不支持发图, 请给作者打钱')
from nonebot import CommandGroup cg = CommandGroup('signup') from . import sponsor from . import participator
def conf_read(name): # 读配置文件 with open('%s/configs/%s' % (os.path.dirname(__file__), f'{name}_config.json')) as FILE: config_dict = json.loads(FILE.read()) return config_dict def conf_write(name, dict_): os.makedirs(os.path.join(os.path.dirname(__file__), 'configs'), 0o755, exist_ok=True) with open('%s/configs/%s' % (os.path.dirname(__file__), f'{name}_config.json'), 'w+', encoding='utf-8') as f: f.write(json.dumps(dict_, sort_keys=False, indent=4, ensure_ascii=False)) _battles = {} _cmd_group = CommandGroup('ksmgame', only_to_me=False) _anonymous_alert = '不要匿名' * 6 try: config = conf_read('ksmgame') except: config = dict(enabled_group=[], pre_version="") conf_write('ksmgame', config) @on_natural_language(only_to_me=False) async def _(session: NLPSession): global config if get_ver() != config['pre_version']: config['pre_version'] = get_ver()
from nonebot import CommandGroup, CommandSession from .data_source import * cmd_qq = ['qq点歌'] cmd_163 = ['网易云点歌', '点歌'] cmd = cmd_qq + cmd_163 __plugin_name__ = '点歌' __plugin_usage__ = fr"""点歌服务 默认为网易云 指令: {' / '.join(cmd)}""" cg = CommandGroup('music', only_to_me=False) @cg.command('qq_song', aliases=cmd_qq) async def music_qq_song(session: CommandSession): session.finish('肥肠爆芡, 正在努力开发qq音乐点歌') keyword = session.get('keyword', prompt='你想点播哪首歌') song_id = await search_song_qq(keyword) if not song_id: session.finish('发生未知错误或歌曲不存在') await session.send(f'[CQ:music,type=qq,id={song_id}]') @cg.command('163_song', aliases=cmd_163) async def music_163_song(session: CommandSession): # session.finish('遇到未知错误, 无法分享') keyword = session.get('keyword', prompt='你想点播哪首歌') song_id = await search_song_163(keyword)
#!/usr/bin/env python3 # -*- coding: utf-8 -*- """ @Author : richardchien @Date : 2020-04-14 21:59:54 @LastEditors : yanyongyu @LastEditTime : 2020-04-14 22:12:11 @Description : None @GitHub : https://github.com/richardchien """ __author__ = "richardchien" from nonebot import CommandGroup __plugin_name__ = "bilibili" def __plugin_usage__(target, *args, **kwargs): if target == "name": return "📺 bilibili番剧" else: return "📺 bilibili番剧\n\n最近有什么番\n2018年1月有什么番\nJOJO的奇妙冒险更新了没有" cg = CommandGroup("bilibili_anime") from . import commands, nlp
FFLogs """ from nonebot import CommandGroup from nonebot.exception import FinishedException from nonebot.permission import GROUP from nonebot.typing import Bot, Event from src.utils.commands import get_command_help from src.utils.helpers import strtobool from .config import plugin_config from .fflogs_api import fflogs from .gate import get_direction from .news import news ff14 = CommandGroup('ff14', block=True) #region 藏宝选门 gate_cmd = ff14.command('gate', aliases={'gate'}) gate_cmd.__doc__ = """ ff14.gate gate 最终幻想XIV 藏宝选门 选择门的数量 /gate 2 /gate 3 """ @gate_cmd.args_parser
from nonebot import CommandGroup, CommandSession from .data_source import * pixivic_cmd = ['psearch', 'pixiv_search', 'p识图1', 'p搜图1'] trace_cmd = ['asearch', 'trace_search', '动画识图'] saucenao_cmd = ['ssearch', 'saucenao_search', 'p识图', 'p搜图', 'p识图2', 'p搜图2'] __plugin_name__ = '搜图' __plugin_usage__ = fr"""搜二次元图 搜索源: Pixivic.com, trace.moe, saucenao.com 存在bug 指令: {' / '.join(pixivic_cmd) + ' | ' + ' / '.join(trace_cmd) + ' | ' + ' / '.join(saucenao_cmd)}""" cg = CommandGroup('isearch', only_to_me=False) @cg.command('pixivic', aliases=pixivic_cmd) async def isearch_pixivic(session: CommandSession): oiu = session.get('oiu', prompt='请发送要搜索的图片, 或图片的url') bot = session.bot boo = await bot.can_send_image() boo = boo['yes'] await session.send('少女祈祷中...') # 怪 if '[CQ:' in oiu: message = session.ctx.get('message')[0] m = str(message) start = m.find('url=') + 4
""" bili plugins __init__.py """ from nonebot import CommandGroup, CommandSession from .data_source import * __plugin_name__ = '新番' __plugin_usage__ = r"""获取bili新番时间表 指令: 新番 / 新番时间表""" cg = CommandGroup('new_animation', only_to_me=False) @cg.command('新番', aliases=['新番时间表', '新番']) async def new_animation(session: CommandSession): q_type = session.get('type', prompt='⌘国创or番剧?⌘') result_str = '' q_type_int = 0 if q_type.find("国创") > -1 else 1 time_line = await get_time_line(q_type_int) if len(time_line) == 0: result_str = '今日无更新' else: for t in time_line: result_str = result_str + t['title'] + t['index'] + '\n' \ + t['time'] + '更新\n' + t['link'] + '\n' await session.send(result_str) @cg.command('extraction', aliases=['提取b站封面', '提取封面', '封面提取'])
), event=session.event, trigger="date", run_date=time, replace_existing=True, ) session.finish( render_expression( EXPR_OK, time=time_str, action=target, escape_args=False) + f"\n提醒创建成功:\n" f"> 提醒时间:{time_str}\n" f"> 内容:{target}") cg = CommandGroup(PLUGIN_NAME, permission=perm.PRIVATE | perm.GROUP_ADMIN | perm.DISCUSS) @cg.command(PLUGIN_NAME, aliases=["添加提醒", "新增提醒", "新建提醒"], only_to_me=False) async def push(session: CommandSession): message = session.get( "message", prompt="你想让我提醒什么内容呢?语句命令都可,输入 `取消、不` 等来取消", arg_filters=[ controllers.handle_cancellation(session), str.lstrip, validators.not_empty("请输入有效内容哦~"), ], ) tn = TimeNormalizer() hour = session.state.get("hour")