Esempio n. 1
0
from nonebot import *
from . import query, util
from hoshino import Service, priv  # 如果使用hoshino的分群管理取消注释这行

#
sv_help = '''
- [原神#XXX] XXX为你的uid
数据来自米游社~~
使用前请绑定米游社
'''.strip()

sv = Service(
    name='原神uid查询',  #功能名
    use_priv=priv.NORMAL,  #使用权限   
    manage_priv=priv.ADMIN,  #管理权限
    visible=True,  #False隐藏
    enable_on_default=True,  #是否默认启用
    bundle='原神',  #属于哪一类
    help_=sv_help  #帮助文本
)


@sv.on_fullmatch(["帮助原神uid查询"])
async def bangzhu(bot, ev):
    await bot.send(ev, sv_help)


# 初始化配置文件
config = util.get_config()

# 初始化nonebot
Esempio n. 2
0
import time
import re
import hashlib
import os
from .data import Question
from hoshino import Service, Privilege as Priv, CommandSession, aiorequests
answers = {}
sv = Service('qa')
qa_path = os.path.expanduser('~/.hoshino/QA')
if not os.path.exists(qa_path):
    os.mkdir(qa_path)


def union(group_id, user_id):
    return (group_id << 32) | user_id


async def cqimage(a):
    if r'[CQ:image,' in a:
        url = re.search(r'url=([\S]*)\]', a).group(1)
        imgname = hashlib.md5(url.encode('utf8')).hexdigest()
        imgget = await aiorequests.get(url)
        imgcon = await imgget.content
        if b'GIF' in imgcon:
            imgpath = os.path.join(qa_path, f'{imgname}.gif')
        else:
            imgpath = os.path.join(qa_path, f'{imgname}.png')
        with open(imgpath, 'wb') as f:
            f.write(imgcon)
            f.close()
        a = f'[CQ:image,file=file:///{os.path.abspath(imgpath)}]'
Esempio n. 3
0
import time

from nonebot import get_bot
from nonebot import CommandSession, MessageSegment
from nonebot import permission as perm
from .data import Question
from hoshino import Service, priv
answers = {}
sv = Service('QA', manage_priv=priv.ADMIN, enable_on_default=False)


def union(group_id, user_id):
    return (group_id << 32) | user_id


# recovery from database
for qu in Question.select():
    if qu.quest not in answers:
        answers[qu.quest] = {}
    answers[qu.quest][union(qu.rep_group, qu.rep_member)] = qu.answer


@sv.on_message('group')
async def handle(bot, context):
    message = context['raw_message']
    if message.startswith('大家问') or message.startswith('有人问'):
        if not sv.check_priv(context, required_priv=Priv.ADMIN):
            await bot.send(context, f'只有管理员才可以用{message[:3]}', at_sender=False)
            return
        msg = message[3:].split('你答', 1)
        if len(msg) == 1:
Esempio n. 4
0
import random
from datetime import datetime

from lxml import etree

import hoshino
from hoshino import Service, aiorequests

sv = Service('bangumi', enable_on_default=False, help_='蜜柑番剧更新推送')


class Mikan:
    link_cache = set()
    rss_cache = []

    @staticmethod
    def get_token():
        return hoshino.config.mikan.MIKAN_TOKEN

    @staticmethod
    async def get_rss():
        res = []
        try:
            resp = await aiorequests.get('RSS链接',
                                         params={'token': Mikan.get_token()},
                                         timeout=10)
            rss = etree.XML(await resp.content)
        except Exception as e:
            sv.logger.error(f'[get_rss] Error: {e}')
            return []
Esempio n. 5
0
import os
import hoshino
from hoshino.util import DailyNumberLimiter
from hoshino import R, Service
from hoshino.util import pic2b64
from hoshino.typing import *
from .luck_desc import luck_desc
from .luck_type import luck_type
from PIL import Image, ImageSequence, ImageDraw, ImageFont

#帮助文本
sv = Service('抽签',
             visible=True,
             enable_on_default=True,
             bundle='抽签',
             help_='''
[抽签|人品|运势|抽凯露签]
随机角色/指定凯露预测今日运势
准确率高达114.514%!
'''.strip())

lmt = DailyNumberLimiter(1)
#设置每日抽签的次数,默认为1
Data_Path = hoshino.config.RES_DIR
#也可以直接填写为res文件夹所在位置,例:absPath = "C:/res/"
Img_Path = 'portunedata/imgbase'


@sv.on_prefix(('抽签', '人品', '运势'), only_to_me=True)
async def portune(bot, ev):
    uid = ev.user_id
Esempio n. 6
0
import hoshino
from hoshino.util import DailyNumberLimiter
from hoshino import R, Service
from hoshino.util import pic2b64
from hoshino.typing import *
from .luck_desc import luck_desc
from .luck_type import luck_type
from PIL import Image, ImageSequence, ImageDraw, ImageFont

sv_help = '''
[抽签|人品|运势|抽可莉签]
随机角色/指定可莉预测今日运势
准确率高达114.514%!
'''.strip()
#帮助文本
sv = Service('genshintune', help_=sv_help, bundle='pcr娱乐')

lmt = DailyNumberLimiter(99)
#设置每日抽签的次数,默认为1
Data_Path = hoshino.config.RES_DIR
#也可以直接填写为res文件夹所在位置,例:absPath = "C:/res/"
Img_Path = 'genshintunedata/imgbase'


@sv.on_prefix(('抽签', '运势'), only_to_me=False)
async def portune(bot, ev):
    uid = ev.user_id
    if not lmt.check(uid):
        await bot.finish(ev, f'你今天已经抽过签了,欢迎明天再来~', at_sender=True)
    lmt.increase(uid)
Esempio n. 7
0
    '你弟弟还好吗?',
    '别充了去玩PCR吧',
    '拿去冲!',
]
stop = random.choice(stop_list)
#configjson的使用
_max = 3
EXCEED_NOTICE = f'{stop}'
#次数限制计数器
_nlmt = DailyNumberLimiter(_max)
#频率限制计数器
_flmt = FreqLimiter(5)

'setu=D:\Github\HoshinoBot\res-20200501\img\setu'
sv = Service('setu',
             manage_priv=Privilege.SUPERUSER,
             enable_on_default=True,
             visible=False)
setu_folder = R.img('setu/').path


#生成另一组图片选择器
#setu2_folder = R.img('setu2/').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)):
                yield R.img('setu/', filename)

Esempio n. 8
0
from hoshino import Service, priv
from hoshino.typing import CQEvent

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

TOP_MANUAL = '''
请仔细阅读使用手册哦~若网页为旧版本请按Ctrl+F5刷新缓存或者直接清理浏览器/QQ缓存
提示:QQ缓存的清理方式是:设置-通用-存储空间-清空缓存数据
本bot由他人搭建,代搭者为Github/corvo007,仅供自用,请勿出租!
'''.strip()


def gen_bundle_manual(bundle_name, service_list, gid):
    manual = [bundle_name]
    service_list = sorted(service_list, key=lambda s: s.name)
    for sv in service_list:
        if sv.visible:
            spit_line = '=' * max(0, 18 - len(sv.name))
            manual.append(
                f"{'开启 | ' if sv.check_enabled(gid) else '关闭 | '} {sv.name} {spit_line}"
            )
            if sv.help:
                manual.append(sv.help)
    return '\n'.join(manual)


@sv.on_prefix(('help', '帮助', '幫助'))
async def send_help(bot, ev: CQEvent):
    bundle_name = ev.message.extract_plain_text().strip()
    bundles = Service.get_bundles()
    if not bundle_name:
Esempio n. 9
0
[查询公会XXX]查询公会名包含XXX的公会
[查询会长XXX]查询会长名字包含XXX的公会
[查询排名114]查询排名为114的公会的信息
[分数线]查询分数线
'''.strip()

_help2 = '''
以下仅限国服B站,渠道服/日台服均不可用
如果不知道会长ID可以先通过通用查询来查询会长的ID
[绑定公会+会长ID]后跟会长ID来绑定公会, 公会战期间每日5:30会自动推送前一日排名
[公会排名]查询本公会的排名(需绑定公会ID)
'''.strip()

sv_query = Service("公会战排名查询",
                   enable_on_default=True,
                   visible=True,
                   help_=_help1,
                   bundle='公会战')

sv_push = Service("公会战排名推送",
                  enable_on_default=True,
                  bundle='公会战',
                  visible=True,
                  help_=_help2)

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/"
}
Esempio n. 10
0
bot = get_bot()
fd = os.path.dirname(__file__)

with open(os.path.join(fd, 'rsdata.json')) as f:
    data = json.load(f)
with open(os.path.join(fd, 'rsplayer.json')) as f:
    player = json.load(f)


def save(data, file):
    with open(file, 'w') as f:
        json.dump(data, f)


sv = Service('俄罗斯轮盘游戏',
             enable_on_default=True,
             visible=True,
             help_='[开枪]俄罗斯轮盘游戏')


# main part
@sv.on_command('rs', aliases=('俄罗斯轮盘', '开枪'), only_to_me=False)
async def spin(session: CommandSession):
    ydie = [
        "很不幸,你死了......",
        "You Die...",
        "你拿着手枪掂了掂,你赌枪里没有子弹\n\n然后很不幸,你死了...",
        "你是一个有故事的人,但是子弹并不想知道这些,它只看见了白花花的脑浆\n\n你死了",
        "你没有想太多,扣下了扳机。你感觉到有什么东西从你的旁边飞过,然后意识陷入了黑暗\n\n你死了",
        "大多数人对自己活着并不心存感激,但你不再是了\n\nYou Die...",
        "你举起了枪又放下,然后又举了起来,你的内心在挣扎,但是你还是扣下了扳机\n\nYou Die...",
        "黄澄澄的子弹穿过了你的大脑,一声枪响之后你倒在了地上,我把你送去了医院\n\n你很幸运,你并没有死。只是你陷入了一片黑暗,身体也无法动弹。但这也许最大的不幸吧",
Esempio n. 11
0
from .sauce_nao import get_image_data
from hoshino import Service, log
from hoshino.typing import *

sv = Service('搜图',
             enable_on_default=True,
             bundle='图片功能',
             help_="""[搜图] {图片} 注意要加空格 或者直接输入[搜图] 等待机器人响应后传入图片
""")

logger = log.new_logger('image')


@sv.on_command('image', aliases=('image', '搜图', '识图', '搜圖', '識圖'))
async def image(session: CommandSession):
    image_data = session.get('image', prompt='图呢?GKD')
    image_data_report = await get_image_data(image_data)

    if image_data_report:
        await session.send(image_data_report)
    else:
        logger.error("Not found imageInfo")
        await session.send("[ERROR]Not found imageInfo")


@image.args_parser
async def _(session: CommandSession):
    image_arg = session.current_arg_images

    if session.is_first_run:
        if image_arg:
Esempio n. 12
0
import asyncio
from PIL import Image, ImageDraw, ImageFont

import hoshino
from hoshino import Service, R
from hoshino.typing import *
from hoshino.util import FreqLimiter, concat_pic, pic2b64, silence

from .. import chara

sv_help = '''
[怎么拆] 接防守队角色名 查询竞技场解法
[点赞] 接作业id 评价作业
[点踩] 接作业id 评价作业
'''.strip()
sv = Service('pcr-arena', help_=sv_help, bundle='pcr查询')

from . import arena

lmt = FreqLimiter(5)

aliases = ('怎么拆', '怎么解', '怎么打', '如何拆', '如何解', '如何打', 'jjc查询')
aliases_b = tuple('b' + a for a in aliases) + tuple('B' + a for a in aliases)
aliases_tw = tuple('台' + a for a in aliases)
aliases_jp = tuple('日' + a for a in aliases)

try:
    thumb_up_i = R.img('priconne/gadget/thumb-up-i.png').open().resize((16, 16), Image.LANCZOS)
    thumb_up_a = R.img('priconne/gadget/thumb-up-a.png').open().resize((16, 16), Image.LANCZOS)
    thumb_down_i = R.img('priconne/gadget/thumb-down-i.png').open().resize((16, 16), Image.LANCZOS)
    thumb_down_a = R.img('priconne/gadget/thumb-down-a.png').open().resize((16, 16), Image.LANCZOS)
Esempio n. 13
0
import aiohttp
from hoshino import R, Service

sv = Service('antiqks', enable_on_default=False)

qks_url = ["granbluefantasy.jp"]
qksimg = R.img('qksimg.jpg').cqcode


@sv.on_keyword(qks_url, normalize=True, event='group')
async def qks_keyword(bot, ctx):
    msg = f'骑空士爪巴\n{qksimg}'
    await bot.send(ctx, msg, at_sender=True)


@sv.on_rex(r'[a-zA-Z0-9\.]{4,12}\/[a-zA-Z0-9]+',
           normalize=False,
           event='group')
async def qks_rex(bot, ctx, match):
    msg = f'骑空士爪巴远点\n{qksimg}'
    res = 'http://' + match.group(0)
    async with aiohttp.TCPConnector(verify_ssl=False) as connector:
        async with aiohttp.request(
                'GET',
                url=res,
                allow_redirects=False,
                connector=connector,
        ) as resp:
            h = resp.headers
            s = resp.status
    if s == 301 or s == 302:
from hoshino import Service, priv
from hoshino.typing import CQEvent

"""
# 将以下三行添加到hoshino/modules/tiwtter/twitter.py 中的 twitter_poller 前,并注释掉原版 @sv.scheduled_job
from .twitter_subscription import TwitterSubscription
t_sub = TwitterSubscription(latest_info, poll_new_tweets)
t_sub.register_commands()


#@sv.scheduled_job('interval', seconds=_freq)
async def twitter_poller():
"""

sv = Service('twitter-subscription', use_priv=priv.ADMIN, manage_priv=priv.SUPERUSER, help_='订阅推/停止看推+账号')


class TwitterSubscription:
    SUB_DATA_FILE = './twitter_sub.cache'

    def __init__(self, latest_info: Dict[str, Dict], poll_new_tweets):
        # { account: {last_tweet_id: int, profile_image: str, media_only: bool, groups: List[int]} }
        self.latest_info = latest_info
        # poll new tweets function
        self.poll_new_tweets = poll_new_tweets

        # load subscription from saved file
        self.load_subs()

    def get_sub_accounts(self) -> List[str]:
from hoshino import Service
from hoshino.typing import CQEvent

sv = Service('priority-demo-0')


@sv.on_prefix('优先级0')
async def demo_fun_0(bot, ev: CQEvent):
    await bot.send(ev, '触发了on_prefixh呦~~~')


@sv.on_fullmatch('优先级0测试')
async def demo_fun_1(bot, ev: CQEvent):
    await bot.send(ev, '触发了on_fullmatch呦~~~')
import random

from hoshino import Service, priv, util
from hoshino.typing import MessageSegment, CQEvent
from . import game_util, GameMaster

sv_help = '''
- [完美配对] 开启一局公主连结主题的完美配対小游戏
- [完美配对排行] 查看完美配对小游戏群排行
'''.strip()

sv = Service(
    name='完美配对',  #功能名
    use_priv=priv.NORMAL,  #使用权限   
    manage_priv=priv.ADMIN,  #管理权限
    visible=True,  #是否可见
    enable_on_default=True,  #是否默认启用
    bundle='娱乐',  #属于哪一类
    help_=sv_help  #帮助文本
)


@sv.on_fullmatch(["帮助完美配对"])
async def bangzhu(bot, ev):
    await bot.send(ev, sv_help, at_sender=True)


# 完美配对(Perfect Match)小游戏相关参数
ROW_NUM = 4
COL_NUM = 4
HIDDEN_NUM = 8
Esempio n. 17
0
import pytz
import peony
from peony import PeonyClient

import hoshino
from hoshino import Service, priv, util, sucmd
from hoshino.config import twitter as cfg
from hoshino.typing import MessageSegment as ms, CommandSession

try:
    import ujson as json
except:
    import json

sv = Service("twitter-poller",
             use_priv=priv.SUPERUSER,
             manage_priv=priv.SUPERUSER,
             visible=False)
bot = hoshino.get_bot()
daemon = None
follow_collection = [
    Service("twitter-stream-test",
            enable_on_default=False,
            manage_priv=priv.SUPERUSER,
            visible=False),
    Service("kc-twitter",
            help_="艦これ推特转发",
            enable_on_default=False,
            bundle="kancolle"),
    Service("pcr-twitter",
            help_="日服Twitter转发",
            enable_on_default=True,
import importlib
import math
import os
import re

import aiohttp

from hoshino import Service, util, priv
from hoshino.modules.pcrsealkiller import Config
from hoshino.typing import CQEvent, MessageSegment

sv = Service('pcr-seal-killer',
             bundle='pcr娱乐',
             help_='''
自动击杀晒卡海豹,请给机器人管理员或者群主,配置指令如下:
启用海豹杀手 [海豹判定阈值]:如果不输入参数,默认阈值是100
禁用海豹杀手:关闭海豹杀手服务,减轻机器人运行开销
'''.strip())

GACHA_KEYWORDS = [
    '所持角色交换Pt', '持有的角色交換Pt', '所持キャラ交換Pt', '持有的角色交换Pt', '所持キャラ交换Pt',
    '所持CSPキャラ交換Pt'
]
FILE_FOLDER_PATH = './hoshino/modules/pcrsealkiller/'
CONFIG_PATH = f'{FILE_FOLDER_PATH}config.json'
PIC_PATH = f'{FILE_FOLDER_PATH}sealkiller.jpg'
DEFAULT_GACHA_THRESHOLD = 100  # 海豹判定阈值, 如果抽卡次数小于这个阈值,则被判定为海豹
STRICT_MODE = True  # 开启严格模式后,如果未发现"NEW"而抽卡次数小于阈值,仍会撤回消息,但是不禁言(宁可错杀也不可放过海豹)
USE_OPENCV = True  # 是否使用Opencv提高识别精确度

gacha_threshold = Config(CONFIG_PATH)
Esempio n. 19
0
from nonebot import on_command
from hoshino import Service, util

sv_help = '''
让群员使用bot来@全体成员,前提bot得有管理员(叫人用
只要前缀为"@全员"就触发,默认关闭
'''.strip()
sv = Service('atall', enable_on_default=False)


@sv.on_prefix('@全员')
async def atall(bot, ev):
    try:
        msg = ev.message.extract_plain_text()
        msg = "[CQ:at,qq=all]" + str(msg)
        await bot.send(ev, msg)
    except:
        await bot.send(ev, '[CQ:at,qq=all]')
Esempio n. 20
0
import pytz
from io import BytesIO
from PIL import Image
import hoshino
from hoshino import Service, priv
from hoshino.typing import CQEvent
import copy
import json
import nonebot
from nonebot import on_command, on_request
from hoshino import sucmd, config, get_bot
from hoshino.typing import NoticeSession
from multiprocessing import Pool
import requests

sv = Service('daidao', bundle='daidao', help_='''
'''.strip())

DAIDAO_DB_PATH = os.path.expanduser('~/.hoshino/daidao.db')
SUPERUSERS = config.SUPERUSERS
GroupID_ON = False  #当GO版本为0.94fix4以上时,允许从群内发起私聊(即使用管理员身份强制私聊,不需要对方主动私聊过),如果低于该版本请不要开启


def get_db_path():
    if not (os.path.isfile(
            os.path.abspath(
                os.path.join(
                    os.path.dirname(__file__), "../"
                    "yobot/yobot/src/client/yobot_data/yobotdata.db")))
            or os.access(
                os.path.abspath(
                    os.path.join(
Esempio n. 21
0
MIX_PROBABILITY = {
    str(list((-1, -1))): [0.8, 0.195, 0.005],
    str(list((-1, 0))): [0.45, 0.5, 0.05],
    str(list((-1, 1))): [0.55, 0.35, 0.1],
    str(list((0, 0))): [0.1, 0.8, 0.1],
    str(list((0, 1))): [0.1, 0.7, 0.2],
    str(list((1, 1))): [0.15, 0.25, 0.6]
}

PRELOAD = True  # 是否启动时直接将所有图片加载到内存中以提高查看仓库的速度(增加约几M内存消耗)

sv = Service('poke-man-pcr',
             bundle='pcr娱乐',
             help_='''
戳一戳机器人, 她可能会送你公主连结卡片哦~
查看仓库 [@某人](这是可选参数): 查看某人的卡片仓库和收集度排名,不加参数默认查看自己的仓库
合成 [卡片1昵称] [卡片2昵称]: 献祭两张卡片以获得一张新的卡片
赠送 [@某人] [赠送的卡片名]: 将自己的卡片赠予别人
交换 [卡片1昵称] [@某人] [卡片2昵称]: 向某人发起卡片交换请求,用自己的卡片1交换他的卡片2
确认交换: 收到换卡请求后一定时间内输入这个指令可完成换卡
'''.strip())
poke_tip_cd_limiter = FreqLimiter(TIP_CD_LIMIT)
daily_tip_limiter = DailyAmountLimiter(POKE_TIP_LIMIT, RESET_HOUR)
daily_limiter = DailyAmountLimiter(POKE_DAILY_LIMIT, RESET_HOUR)
daily_give_limiter = DailyAmountLimiter(GIVE_DAILY_LIMIT, RESET_HOUR)
cooling_time_limiter = FreqLimiter(POKE_COOLING_TIME)
exchange_request_master = ExchangeRequestMaster(REQUEST_VALID_TIME)
db = CardRecordDAO(DB_PATH)
font = ImageFont.truetype('arial.ttf', 16)
card_ids = []
card_file_names_all = []
star2rarity = {'1': -1, '3': 0, '6': 1}  # 角色头像星级->卡片稀有度
Esempio n. 22
0

查询记录之前的排名

"""
from nonebot import *
from . import util
from . import clanrank
from . import locked
from hoshino import Service  # 如果使用hoshino的分群管理取消注释这行

#
sv = Service('工会排名2',
             visible=True,
             enable_on_default=False,
             bundle='工会排名2',
             help_='''
无说明,不要和工会排名同时开启
'''.strip())

# 初始化配置文件
config = util.get_config()

# 初始化nonebot
_bot = get_bot()


@sv.on_message('group'
               )  # 如果使用hoshino的分群管理取消注释这行 并注释下一行的 @_bot.on_message("group")
# @_bot.on_message("group") # nonebot使用这
async def epck_main(*params):
Esempio n. 23
0
from hoshino import Service, Privilege as Priv
sv = Service('anti_group_recall',
             visible=False,
             enable_on_default=False,
             manage_priv=Priv.SUPERUSER)


@sv.on_notice('group_recall')
async def _(session):
    gid = session.event.group_id
    uid = session.event.user_id
    oid = session.event.operator_id
    msgid = session.event.message_id
    msgdic = await session.bot.get_msg(message_id=msgid)
    msg = msgdic['raw_message']
    user_dic = await session.bot.get_group_member_info(
        group_id=session.event.group_id,
        user_id=session.event.user_id,
        no_cache=True)
    user_card = user_dic['card'] if user_dic['card'] else user_dic['nickname']
    if oid == uid:
        await session.bot.send_group_msg(
            message=f'{user_card}({uid})撤回消息:\n{msg}', group_id=gid)
    else:
        await session.bot.send_group_msg(
            message=f'管理员撤回了{user_card}({uid})的消息:\n{msg}', group_id=gid)
from hoshino.typing import *
from kth_timeoutdecorator import TimeoutException
import hoshino
from .japanese import get_definition_of_word
from hoshino import log, Service

sv = Service('japanese')

logger = log.new_logger('japanese')


@sv.on_command('jpd', aliases=('日典', 'jd'), only_to_me=False)
async def jpd(session: CommandSession):
    word = session.get('word', prompt='你想查询哪个单词呢?')
    jpd_report = ""
    try:
        jpd_report = await get_definition_of_word(word)
    except TimeoutException as e:
        logger.error("Timeout! {}".format(e))
        jpd_report = "[ERROR]Timeout!"

    if jpd_report:
        await session.send(jpd_report)
    else:
        logger.error("Not found jpdInfo")
        await session.send("[ERROR]Not found jpdInfo")


@jpd.args_parser
async def _(session: CommandSession):
    stripped_arg = session.current_arg_text.strip()
Esempio n. 25
0
from hoshino import Service
from .spider import *

svtw = Service('pcr-news-tw')
svbl = Service('pcr-news-bili')

async def news_poller(spider:BaseSpider, sv:Service, TAG):
    if not spider.item_cache:
        await spider.get_update()
        sv.logger.info(f'{TAG}新闻缓存为空,已加载至最新')
        return
    news = await spider.get_update()
    if not news:
        sv.logger.info(f'未检索到{TAG}新闻更新')
        return
    sv.logger.info(f'检索到{len(news)}条{TAG}新闻更新!')
    await sv.broadcast(spider.format_items(news), TAG, interval_time=0.5)
    
@svtw.scheduled_job('cron', minute='*/20', jitter=20)
async def sonet_news_poller():
    await news_poller(SonetSpider, svtw, '台服官网')

@svbl.scheduled_job('cron', minute='*/20', jitter=20)
async def bili_news_poller():
    await news_poller(SonetSpider, svbl, 'B服官网')


async def send_news(session, spider:BaseSpider, max_num=5):
    if not spider.item_cache:
        await spider.get_update()
    news = spider.item_cache
Esempio n. 26
0
import random
from hoshino import Service, R
from hoshino.typing import CQEvent
from hoshino.util import DailyNumberLimiter

sv = Service('pcr-login-bonus', bundle='pcr娱乐', help_='[#签到] 给主さま盖章章')

lmt = DailyNumberLimiter(1)
login_presents = [
    '扫荡券×5',  '卢币×1000', '普通EXP药水×5',  '宝石×50',  '玛那×3000',
    '扫荡券×10', '卢币×1500', '普通EXP药水×15', '宝石×80',  '白金转蛋券×1',
    '扫荡券×15', '卢币×2000', '上级精炼石×3',   '宝石×100', '白金转蛋券×1',
]
todo_list = [
    '找伊绪老师上课',
    '给宫子买布丁',
    '和真琴寻找伤害优衣的人',
    '找镜哥探讨女装',
    '跟吉塔一起登上骑空艇',
    '和霞一起调查伤害优衣的人',
    '和佩可小姐一起吃午饭',
    '找小小甜心玩过家家',
    '帮碧寻找新朋友',
    '去真步真步王国',
    '找镜华补习数学',
    '陪胡桃排练话剧',
    '和初音一起午睡',
    '成为露娜的朋友',
    '帮铃莓打扫咲恋育幼院',
    '和静流小姐一起做巧克力',
    '去伊丽莎白农场给栞小姐送书',
Esempio n. 27
0
from .. import chara
from .gacha import Gacha

try:
    import ujson as json
except:
    import json

sv_help = '''
[星乃来发十连] 转蛋模拟
[星乃来发单抽] 转蛋模拟
[星乃来一井] 4w5钻!
[查看卡池] 模拟卡池&出率
[切换卡池] 更换模拟卡池
'''.strip()
sv = Service('gacha', help_=sv_help, bundle='pcr娱乐')
jewel_limit = DailyNumberLimiter(6000)
tenjo_limit = DailyNumberLimiter(1)

JEWEL_EXCEED_NOTICE = f'您今天已经抽过{jewel_limit.max}钻了,欢迎明早5点后再来!'
TENJO_EXCEED_NOTICE = f'您今天已经抽过{tenjo_limit.max}张天井券了,欢迎明早5点后再来!'
POOL = ('MIX', 'JP', 'TW', 'BL')
DEFAULT_POOL = POOL[0]

_pool_config_file = os.path.expanduser('~/.hoshino/group_pool_config.json')
_group_pool = {}
try:
    with open(_pool_config_file, encoding='utf8') as f:
        _group_pool = json.load(f)
except FileNotFoundError as e:
    sv.logger.warning(
Esempio n. 28
0
import os
import random


from nonebot.exceptions import CQHttpError
from nonebot import MessageSegment


from hoshino import R, Service, priv


sv = Service('mawo', enable_on_default=True, visible=False)
xcw_folder = R.get('record/mawo/').path


def get_xcw():
    files = os.listdir(xcw_folder)
    filename = random.choice(files)
    rec = R.get('record/mawo/', filename)
    return rec


@sv.on_fullmatch('骂我', only_to_me=True)
async def xcw(bot, ev) -> MessageSegment:
    # conditions all ok, send a xcw.
    file = get_xcw()
    try:
        rec = MessageSegment.record(f'file:///{os.path.abspath(file.path)}')
        await bot.send(ev, rec)
    except CQHttpError:
        sv.logger.error("发送失败")
Esempio n. 29
0
import os
import re
import io
import json
import requests
from io import BytesIO
from PIL import Image
from collections import OrderedDict

from hoshino import Service
from hoshino.typing import CQEvent, MessageSegment

sv = Service('picfinder', help_='''
[识图+图片] 查询图片来源
'''.strip())

api_key = ""  #https://saucenao.com/自行申请
EnableRename = False
minsim = '80!'  #相似度下限,低于下限不显示结果(80!指80%)
thumbSize = (250, 250)

#启用或禁用索引,1:启用,0:禁用
index_hmags = '0'  #0: H-Magazines  (Last Updated: December 2010) 不完整 - 大部分被 #18 替代
index_reserved = '0'  #1
index_hcg = '0'  #2: H-Game CG  (Last Updated: June 2011) 不完整 - 大部分被 #18 替代
index_ddbobjects = '0'  #3: DoujinshiDB  (Last Updated: January 2011) 不完整 - 大部分被 #18 替代
index_ddbsamples = '0'  #4
index_pixiv = '1'  #5: pixiv Images  (Continuously Updated) 相当完整 - All accessible images are added every few hours
index_pixivhistorical = '1'  #6: pixiv Historical
index_reserved = '0'  #7
index_seigaillust = '1'  #8: Nico Nico Seiga  (Continuously Updated) 相当完整 - All accessible images are added every few hours
Esempio n. 30
0
import random
from hoshino import Service

sv = Service('chooseone')


@sv.on_message('group', can_private=1)
async def chooseone(bot, ctx):
    message = ctx['raw_message']
    if message.startswith('选择卡池'):
        return
    if message.startswith('选择'):
        msg = message[2:].split('还是')
        if len(msg) == 1:
            return
        choices = list(filter(lambda x: len(x) != 0, msg))
        if not choices:
            await bot.send(ctx, '选项不能全为空!', at_sender=True)
            return
        msgs = ['您的选项是:']
        idchoices = list(f'{i+1}. {choice}'
                         for i, choice in enumerate(choices))
        msgs.extend(idchoices)
        if random.randrange(1000) <= 76:
            msgs.append('建议您选择: “我全都要”')
        else:
            final = random.choice(choices)
            msgs.append(f'建议您选择: {final}')
        await bot.send(ctx, '\n'.join(msgs), at_sender=True)