Пример #1
0
from .data_source import add_text, get_apikey, get_GmServer, get_db_path, get_web_address

sv_help = '''
[生成会战报告] 生成自己的会战报告书
[生成离职报告] 生成自己的离职报告书
[看看报告+@他人] 查看他人的会战报告书(限管理)
'''.strip()

sv = Service('公会战报告书', help_=sv_help, bundle='会战')

try:
    config = hoshino.config.clanbattlereport.report_config
except:
    hoshino.logger.error('not found config of clanbattlereport')

_lmt = FreqLimiter(config.time_limit)
logo = Image.open(path.join(path.dirname(__file__), 'logo.png'))
year = datetime.now().strftime('%Y')
month = str(int(datetime.now().strftime('%m')))

try:
    yobot_url = get_web_address()
except OSError:
    yobot_url = config.yobot_url


@sv.on_rex(r'生成(离职|会战)报告')
async def create_resignation_report(bot, ev: CQEvent):
    if ev['match'].group(1) == '离职':
        background = config.Resignation
    elif ev['match'].group(1) == '会战':
Пример #2
0
from hoshino.typing import *
from hoshino import Service, priv
from hoshino.util import FreqLimiter, DailyNumberLimiter

from .setumaster import *
from .discernmaster import setu_distinguish

import random
from datetime import datetime

sv = Service('setu', visible=False)
_nlmt = DailyNumberLimiter(15)
_flmt = FreqLimiter(15)

SETU_EXCEED_NOTICE = '你今天冲的太多辣,欢迎明早5点后再来!'


@sv.on_rex(r'^来?[份点张]?[涩色瑟]图$')
async def setu_one(bot, ev: CQEvent):

    if not _flmt.check(ev.user_id):
        await bot.send(
            ev,
            f'乖,要懂得节制噢,涩图冷却中(剩余 {int(_flmt.left_time(ev.user_id)) + 1}秒)',
            at_sender=True)
        return
    if not _nlmt.check(ev.user_id):
        await bot.send(ev, SETU_EXCEED_NOTICE, at_sender=True)
        return
    _flmt.start_cd(ev.user_id)
    _nlmt.increase(ev.user_id, 1)
Пример #3
0
from hoshino.util import FreqLimiter
from .chara import Chara
from hoshino import Service
from hoshino import R
sv = Service('whois')
_lmt = FreqLimiter(5)
_lmt1 = FreqLimiter(5)


@sv.on_rex(r'^[谁誰]是\s*(.{1,20})$', normalize=False, can_private=1)
async def whois(bot, ctx, match):
    uid = ctx['user_id']
    if not _lmt.check(uid):
        await bot.send(ctx, '您查询得太快了,请稍等一会儿', at_sender=True)
        return
    _lmt.start_cd(uid)

    name = match.group(1)
    chara = Chara.fromname(name, star=0)
    if chara.id == Chara.UNKNOWN:
        msg = [f'兰德索尔似乎没有叫"{name}"的人']
        if uid not in bot.config.SUPERUSERS:
            _lmt.start_cd(uid, 300)
            msg.append('您的下次查询将于5分钟后可用')
        await bot.send(ctx, '\n'.join(msg), at_sender=True)
        return

    msg = f'\n{chara.name}\n{chara.icon.cqcode}'
    await bot.send(ctx, msg, at_sender=True)
STARDIC = {"一": 1, "二": 2, "三": 3, "四": 4, "五": 5, "六": 6}
import random
import json
import os
import datetime
import requests
from io import BytesIO
from random import choice
from PIL import Image, ImageDraw, ImageFont, ImageFilter

from hoshino import R, Service, priv
from hoshino.typing import CQEvent, MessageSegment
from hoshino.util import pic2b64, FreqLimiter

sv = Service('generator-text', visible=True, manage_priv=priv.ADMIN)

_flmt = FreqLimiter(300)

def load_config(path):
    try:
        with open(path,'r',encoding='utf8') as f:
            config = json.load(f)
            return config
    except:
        return {}

def measure(msg, font_size, img_width):
    i = 0
    l = len(msg)
    length = 0
    positions = []
    while i < l :
Пример #5
0
import aiohttp
from PIL import Image

from .._res import Res as R
from hoshino.service import Service
from hoshino.typing import HoshinoBot, CQEvent
from hoshino.util import DailyNumberLimiter, FreqLimiter
from .._util import extract_url_from_event
from .data_source import detect_face, concat, gen_head
from .opencv import add
from .config import *

sv = Service('接头霸王')
_nlt = DailyNumberLimiter(5)
_flt = FreqLimiter(15)

@sv.on_prefix(('接头霸王', '接头'))
async def concat_head(bot: HoshinoBot, ev: CQEvent):
    uid = ev.user_id
    if not _nlt.check(uid):
        await bot.finish(ev, '今日已经到达上限!')

    if not _flt.check(uid):
        await bot.finish(ev, '太频繁了,请稍后再来')

    url = extract_url_from_event(ev)
    if not url:
        await bot.finish(ev, '请附带图片!')
    url = url[0]
    await bot.send(ev, '请稍等片刻~')
Пример #6
0
import hoshino
import asyncio
from hoshino import Service, aiorequests, priv
from hoshino.util import FreqLimiter, DailyNumberLimiter
from .request import *
from .config import DAILY_MAX_NUM, FREQ_LIMIT

sv = Service('setu_acggov',
             bundle='pcr娱乐',
             enable_on_default=False,
             manage_priv=priv.SUPERUSER,
             help_='随机涩图/setu [n]\n本日涩图排行榜 [page]\n看涩图 [n] 或 [start end]')

#设置limiter
tlmt = DailyNumberLimiter(DAILY_MAX_NUM)
flmt = FreqLimiter(FREQ_LIMIT)


def check_lmt(uid, num):
    if uid in hoshino.config.SUPERUSERS:
        return 0, ''
    if not tlmt.check(uid):
        return 1, f'您今天已经冲过{DAILY_MAX_NUM}次了,请明天再来!'
    if num > 1 and (DAILY_MAX_NUM - tlmt.get_num(uid)) < num:
        return 1, f'您今天的剩余次数为{DAILY_MAX_NUM - tlmt.get_num(uid)}次,已不足{num}次,请少冲一点!'
    if not flmt.check(uid):
        return 1, f'您冲的太快了,请等待{round(flmt.left_time(uid))}秒!'
    tlmt.increase(uid, num)
    flmt.start_cd(uid)
    return 0, ''
Пример #7
0
import os
import random

from nonebot.exceptions import CQHttpError

from hoshino import R, Service, priv
from hoshino.util import FreqLimiter, DailyNumberLimiter
from hoshino.typing import CQEvent

_max = 20
_nlmt = DailyNumberLimiter(_max)
#每人日调用上限
_cd = 3
_flmt = FreqLimiter(_cd)
#调用冷却
EXCEED_NOTICE = f'您今天已经冲过{_max}次了,请明日再来或请求群管重置次数哦!'

sv = Service('setu',
             manage_priv=priv.ADMIN,
             enable_on_default=True,
             visible=True)
setu_folder = R.img('setu/').path


#本地涩图目录
def setu_gener():
    while True:
        filelist = os.listdir(setu_folder)
        random.shuffle(filelist)
        for filename in filelist:
            if os.path.isfile(os.path.join(setu_folder, filename)):
Пример #8
0
from hoshino.util import FreqLimiter
from ..chara import Chara
from . import sv

_lmt = FreqLimiter(5)


@sv.on_rex(r'^[谁誰]是\s*(.{1,20})$', normalize=False)
async def whois(bot, ctx, match):
    uid = ctx['user_id']
    if not _lmt.check(uid):
        await bot.send(ctx, '您查询得太快了,请稍等一会儿', at_sender=True)
        return
    _lmt.start_cd(uid)

    name = match.group(1)
    chara = Chara.fromname(name, star=0)
    if chara.id == Chara.UNKNOWN:
        _lmt.start_cd(uid, 10)
        await bot.send(
            ctx,
            f'兰德索尔似乎没有叫"{name}"的人\n角色别称补全计划:github.com/Ice-Cirno/HoshinoBot/issues/5\n您的下次查询将于10秒钟后可用',
            at_sender=True)
        return

    msg = f'{chara.icon.cqcode}{chara.name}'
    await bot.send(ctx, msg, at_sender=True)
Пример #9
0
from hoshino import Service, R
from hoshino.util import FreqLimiter
from hoshino.typing import CQEvent, HoshinoBot

sv = Service('anti-lex', enable_on_default=False, help_='反蕾打卡提醒')
lmt = FreqLimiter(3600)


@sv.scheduled_job('cron', hour='*/8')
async def hour_call():
    pic = R.img("lexbiss.jpg").cqcode
    msg = f'{pic}\n共创和谐环境人人有责 拿出行动天天打卡🍒Σ打卡帖bbs.nga.cn/read.php?tid=29780767'
    await sv.broadcast(msg, 'anti-lex')


@sv.on_keyword('蕾皇', 'lex')
async def keyword_anti(bot: HoshinoBot, ev: CQEvent):
    pic = R.img("lexbiss.jpg").cqcode
    if lmt.check(ev.group_id):
        await bot.send(ev, pic)
        lmt.start_cd(ev.group_id)
Пример #10
0
from hoshino import Service
from hoshino.util import FreqLimiter

sv_help = '''
[查询排名] 接排名 查询最新该排名公会
[查询公会] 接公会名称 查询最新该公会
[查询会长] 接会长名称 查询最新该会长公会
[查询分数] 接分数 查询最新该分数公会
[查询档线] 查询最新各档线分数
'''.strip()
sv = Service('clanrank', enable_on_default=True, bundle='pcr排名', help_=sv_help)

from . import query

lmt = FreqLimiter(10)


@sv.on_prefix(('查询公会', '公会查询'))
async def name_query(bot, ev):
    uid = ev.user_id

    if not lmt.check(uid):
        await bot.finish(ev, '您查询得过于频繁,请稍等片刻', at_sender=True)

    # 处理输入数据
    name = ev.message.extract_plain_text()
    if len(name) == 0:
        await bot.finish(ev, "请发送'查询公会+行会名称'进行查询,无需+号", at_sender=True)

    lmt.start_cd(uid)
Пример #11
0
from hoshino import util
from hoshino.util import FreqLimiter
from hoshino.service import Service
from nonebot import on_command
import requests, json

sv = Service('clanbattle-query', enable_on_default=True)

_lmt = FreqLimiter(2)


@sv.on_command('会战排名查询', aliases=('会战查询', '会战排名'), only_to_me=False)
async def clanbattle_query_menu(session):
    msg = f'\n公会战排名查询-API By @Kengxxiao\n请选择查询方式:\n>>>按公会名查询:公会查询 公会名 | cbqn 公会名\n>>>按会长名查询:会长查询 会长名字 | cbqm 会长名字\n>>>按排名查询:排名查询 名次 | cbqr 名次\n>>>按分数查询:分数查询 | cbqs 分数\n>>>当前档线查询:查档 | cbql\nTips:"|"前后为命令的两种写法,可以任意选择一种使用~\n例如:"公会查询 北宇治"与"cbqn 北宇治"效果相同\n公会名查询和会长名查询支持正则表达式哦~'
    await session.send(msg, at_sender=True)


@sv.on_command('公会查询', aliases=('cbqn'), only_to_me=False)
async def clanbattle_query_clanname(session):
    uid = session.ctx['user_id']
    if not _lmt.check(uid):
        await session.send('查询得太快了哦,请稍等一会儿~', at_sender=True)
        return
    _lmt.start_cd(uid)
    clan_name = util.normalize_str(session.current_arg_text)
    url = "https://service-kjcbcnmw-1254119946.gz.apigw.tencentcs.com//name/0"
    name = json.dumps({"clanName": clan_name})
    headers = {
        'Accept': 'application/json, text/javascript, */*; q=0.01',
        'Custom-Source': 'PurinBot',
        'User-Agent':
Пример #12
0
from hoshino import Service, R, priv
from hoshino.typing import *
from hoshino.util import FreqLimiter, concat_pic, pic2b64, silence
from .news_spider import *

sv_help = '''=====功能=====
[马娘新闻] 查看最近五条新闻

[新闻翻译] 查看翻译命令和新闻编号(限近5条)

[新闻翻译 1] 翻译第1条新闻,编号可选值(1/2/3/4/5)

(自动推送) 该功能没有命令'''.strip()

_limtime = 20    # 单个人翻译冷却时间(单位:喵)
_flmt = FreqLimiter(_limtime)

if os.path.exists(R.img('umamusume_news').path):
    shutil.rmtree(R.img('umamusume_news').path)  #删除目录,包括目录下的所有文件
    os.mkdir(R.img('umamusume_news').path)
else:
    os.mkdir(R.img('umamusume_news').path)

sv = Service('umamusume_news', help_=sv_help, enable_on_default=True, bundle='马娘新闻订阅')
svuma = Service('umamusume-news-poller', enable_on_default=False, help_='马娘新闻播报')

# 帮助界面
@sv.on_fullmatch("马娘新闻帮助")
async def help(bot, ev):
    await bot.send(ev, sv_help)
Пример #13
0
import os
import random

from nonebot.exceptions import CQHttpError

from hoshino import R, Service, priv, util
from hoshino.util import FreqLimiter, DailyNumberLimiter
from hoshino.config.mantra import MANTRA_MATRIX

_max = 50
_fl = 60
EXCEED_NOTICE = f'今天艹爷已经迫害过{_max}次了,欢迎明早5点后在继续迫害!'
_n_limit = DailyNumberLimiter(_max)
_f_limit = FreqLimiter(_fl)

sv = Service('mantra',
             manage_priv=priv.SUPERUSER,
             enable_on_default=False,
             visible=False)

mantra_folders = dict()
for i in MANTRA_MATRIX:
    mantra_folders[i] = os.path.join(
        R.img('mantra/').path, MANTRA_MATRIX[i]['path'])


def mantra_generator(name):
    while True:
        file_list = os.listdir(mantra_folders[name])
        random.shuffle(file_list)
        for filename in file_list:
Пример #14
0
import os
import aiohttp
import datetime
import calendar
import re
import base64
import json
from hoshino import Service, priv 
from hoshino.util import FreqLimiter
from hoshino.typing import CQEvent
import matplotlib.pyplot as plt
import matplotlib.font_manager as font_manager
from PIL import Image,ImageFont,ImageDraw
import math

lmt = FreqLimiter(60)   #冷却时间60秒
bg_resign = 'resign.jpg'
bg_report = 'report.jpg'
font_path = os.path.join(os.path.dirname(__file__), 'SimHei.ttf')
constellation_name = ['???', '水瓶', '双鱼', '白羊', '金牛', '双子', '巨蟹', '狮子', '处女', '天秤', '天蝎', '射手', '摩羯']
cycle_data = {
    'cn': {
        'cycle_mode': 'days',
        'cycle_days': 28,
        'base_date': datetime.date(2020, 7, 28),  #从巨蟹座开始计算
        'base_month': 5,
        'battle_days': 6,
        'reserve_days': 0
    },
    'jp': {
        'cycle_mode': 'nature',
Пример #15
0
import hoshino
from hoshino.typing import *
from hoshino import Service, R, logger
from hoshino.modules.priconne import chara
from hoshino.util import pic2b64, FreqLimiter

sv = Service('game',
             help_='[猜语音] 猜猜随机的语音来自哪位角色\n[猜卡面] 猜猜截取的卡面来自哪位角色',
             bundle='pcr娱乐',
             enable_on_default=True,
             visible=True)

GAME_POOL = ('voiceguess', 'cardguess', 'baseball', 'racing')
ONE_TURN_TIME = 30
glmt = FreqLimiter(ONE_TURN_TIME)

_group_game = {}
_group_game = defaultdict(lambda: '', _group_game)
_group_winner = {}
_group_winner = defaultdict(lambda: [], _group_winner)
_group_parameter = {}

voicepath = os.path.join(hoshino.config.RES_DIR, 'record/title_silk')
cardpath = os.path.join(hoshino.config.RES_DIR, 'img/priconne/card/')

GAME_NAME_TIP = '请选择以下小游戏\n> 猜语音\n> 猜卡面\n> 棒球(开发中)\n> 赛马(开发中)'


@sv.on_fullmatch(('小游戏'))
async def game_start(bot, ev: CQEvent):
Пример #16
0
【查询排名114】查询排名为114的公会的信息
【分数线】查询分数线
'''.strip())

sv_push = Service("clanrank-push",enable_on_default=True,visible=True,help_='''
以下仅限国服B站,渠道服/日台服均不可用
如果不知道会长ID可以先通过通用查询来查询会长的ID
【绑定公会】后跟会长ID来绑定公会, 公会战期间每日5:30会自动推送前一日排名
【公会排名】查询本公会的排名
'''.strip())

url_first = "https://service-kjcbcnmw-1254119946.gz.apigw.tencentcs.com/"
headers = {"Custom-Source":"GitHub@var-mixer","Content-Type": "application/json","Referer": "https://kengxxiao.github.io/Kyouka/"}

_time_limit = 120
_lmt = FreqLimiter(_time_limit)

def loadConfig():
    """
    返回json格式的config
    """
    if os.path.exists('./hoshino/modules/clanrank/clanrank.json'):
        with open("./hoshino/modules/clanrank/clanrank.json","r",encoding='utf-8') as dump_f:
            try:
                # 读取错误一般是人工改动了config并且导致json格式错误
                clanrank_config = json.load(dump_f)
            except:
                clanrank_config = {}
    else:
        clanrank_config = {}
    return clanrank_config
Пример #17
0
from .._res import Res as R
from hoshino.service import Service
from hoshino.typing import HoshinoBot, CQEvent
from hoshino.util import DailyNumberLimiter, FreqLimiter
from .._util import extract_url_from_event
from .data_source import detect_face, concat, gen_head
from .opencv import add
from .config import *

sv = Service('接头霸王', visible= True, enable_on_default= True, bundle='接头霸王', help_='''
- [接头1 XX] XX为一张图片,三次元限定,否则生草
- [接头2 XX] XX为一张图片,二次元限定,否则生草
- [接头  XX] 默认二次元接头
'''.strip())
_nlt = DailyNumberLimiter(5)
_flt = FreqLimiter(5)

@sv.on_prefix(('接头霸王', '接头'))
async def concat_head(bot: HoshinoBot, ev: CQEvent):
    uid = ev.user_id
    if not _nlt.check(uid):
        await bot.finish(ev, '今日已经到达上限!')

    if not _flt.check(uid):
        await bot.finish(ev, '太频繁了,请稍后再来')

    url = extract_url_from_event(ev)
    if not url:
        await bot.finish(ev, '请附带图片!')
    url = url[0]
    await bot.send(ev, '请稍等片刻~')
Пример #18
0
#启动一个线程一直补充色图
thd = threading.Thread(target=wh.keep_supply)
if ONLINE_MODE:
    print('线程启动')
    thd.start()

#启动一个线程一直补充r18色图
thd_r18 = threading.Thread(target=r18_wh.keep_supply)
if ONLINE_MODE:
    print('r18线程启动')
    thd_r18.start()

#设置limiter
from hoshino.util import DailyNumberLimiter, FreqLimiter
_num_limiter = DailyNumberLimiter(DAILY_MAX_NUM)
_freq_limiter = FreqLimiter(5)

from hoshino.priv import *
from hoshino.util4sh import download_async
sv = Service('涩图')


@sv.on_rex(r'^来?([1-5])?[份点张]?[涩色瑟]图(.{0,10})$')
async def send_common_setu(bot, event: Event):
    uid = event.user_id
    self_id = event.self_id
    gid = event.group_id
    user_priv = get_user_priv(event)
    is_to_delete = True if gid in g_delete_groups else False

    if not _num_limiter.check(uid):
Пример #19
0
import aiohttp
from PIL import Image

from .._res import Res as R
from hoshino.service import Service
from hoshino.typing import HoshinoBot, CQEvent
from hoshino.util import DailyNumberLimiter, FreqLimiter
from .._util import extract_url_from_event
from .config import *
from .data_source import detect_face, concat, KyaruHead, auto_head, gen_head

conf_path = path.join(path.dirname(__file__), 'user_conf')
sv = Service('接头霸王')
_nlt = DailyNumberLimiter(DAILY_MAX_NUM)
_flt = FreqLimiter(30)

try:
    with open(conf_path, 'rb') as f:
        user_conf_dic = pickle.load(f)
except FileNotFoundError:
    user_conf_dic = {}


@sv.on_prefix(('接头霸王', '接头'))
async def concat_head(bot: HoshinoBot, ev: CQEvent):
    uid = ev.user_id
    if not _nlt.check(uid):
        await bot.finish(ev, '今日已经到达上限!')

    if not _flt.check(uid):