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, ''
import random from collections import defaultdict try: import ujson as json except: import json from hoshino import util from hoshino import NoneBot, CommandSession, MessageSegment, Service, Privilege as Priv from hoshino.util import silence, concat_pic, pic2b64, DailyNumberLimiter from .gacha import Gacha from ..chara import Chara sv = Service('gacha') jewel_limit = DailyNumberLimiter(9000) tenjo_limit = DailyNumberLimiter(5) GACHA_DISABLE_NOTICE = '本群转蛋功能已禁用\n如欲开启,请与维护组联系' JEWEL_EXCEED_NOTICE = f'您今天已经抽过{jewel_limit.max}钻了,欢迎明早5点后再来!' TENJO_EXCEED_NOTICE = f'您今天已经抽过{tenjo_limit.max}张天井券了,欢迎明早5点后再来!' SWITCH_POOL_TIP = 'β>发送"选择卡池"可切换' POOL = ('BL', 'JP', 'TW', 'MIX', "QUN") 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:
from hoshino.util import DailyNumberLimiter from hoshino.modules.hoshino_training.util.module import * tenjo_limit = DailyNumberLimiter(5) TENJO_EXCEED_NOTICE = f'您今天已经抽过{tenjo_limit.max}张天井券了,欢迎明早5点后再来!' async def silence(ev, ban_time, skip_su=True): pass module_replace('hoshino.modules.priconne.gacha', 'tenjo_limit', tenjo_limit) module_replace('hoshino.modules.priconne.gacha', 'TENJO_EXCEED_NOTICE', TENJO_EXCEED_NOTICE) module_replace('hoshino.modules.priconne.gacha', 'silence', silence)
import os import random from datetime import datetime from PIL import ImageDraw, ImageFont from hoshino import R, Service from hoshino.typing import * from hoshino.util import pic2b64, DailyNumberLimiter sv = Service('clock', visible=False) fontPath = R.img('font/SF-Pro-Display-Bold.otf').path clock_limit = DailyNumberLimiter(1) @sv.on_keyword(('晚安')) async def clock(bot, ev): #仅开放七曜群和塞姆利亚群 if ev.group_id == 1058019377 or ev.group_id == 602138153: if not clock_limit.check(ev.group_id): return clock_limit.increase(ev.group_id) text = datetime.now().strftime('%H:%M') imgFont = ImageFont.truetype(font=fontPath, size=90) textSize = imgFont.getsize(text=text) img = R.img(f'clock/{random.randint(1, 5)}.JPG').open() draw = ImageDraw.Draw(img) xy = (332 - textSize[0] / 2, 310 - textSize[1] / 2) draw.text(xy=xy, text=text, font=imgFont, fill='black')
import random from datetime import timedelta import nonebot from nonebot import Message, MessageSegment, message_preprocessor, on_command from nonebot.message import _check_calling_me_nickname import hoshino from hoshino.service import sucmd from hoshino.typing import CommandSession, CQHttpError from hoshino import R, Service, util, priv from hoshino.util import DailyNumberLimiter sv = Service('anti-abuse', visible=False, manage_priv=priv.SUPERUSER) crawl = DailyNumberLimiter(1) BANNED_WORD = ('rbq', 'RBQ', '憨批', '废物', '死妈', '崽种', '傻逼', '傻逼玩意', '没用东西', '傻B', '傻b', 'SB', 'sb', '煞笔', 'cnm', 'kkp', 'nmsl', 'D区', '口区', '我是你爹', 'nmbiss', '弱智', '给爷爬', '杂种爬', '滚', '给爷滚', '给老子滚', '给老子爬') def get_sec(tstr): hour, minute, second = 0, 0, 0 try: if "小时" in tstr: splt = tstr.split("小时") hour = int(splt[0]) tstr = splt[1]
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)
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('group_pool_config.json not found, will create when needed.') _group_pool = defaultdict(lambda: DEFAULT_POOL, _group_pool)
@sv.on_fullmatch(["帮助猜现实"]) async def bangzhu(bot, ev): await bot.send(ev, sv_help, at_sender=True) PRICE = 150 #获胜所得的金币 MAX_NUM = 6 #每日获得的金币次数 DOWNLOAD_THRESHOLD = 142 MULTIPLE_VOICE_ESTERTION_ID_LIST = ['0044'] ONE_TURN_TIME = 15 HOSHINO_RES_PATH = os.path.expanduser(hoshino.config.RES_DIR) DIR_PATH = os.path.join(HOSHINO_RES_PATH, 'img/priconne/unit/actual') DB_PATH = os.path.expanduser("~/.hoshino/pcr_actual_guess.db") gm = GameMaster(DB_PATH) lm = DailyNumberLimiter(MAX_NUM) def get_estertion_id_list(): url = 'https://redive.estertion.win/card/actual_profile' soup = BeautifulSoup(requests.get(url).text, 'html.parser') l = [] for a in soup.find_all('a'): s = a['href'] l.append(s) return l logger = log.new_logger('actual_guess', hoshino.config.DEBUG)
import hoshino from hoshino import Service, priv, util from hoshino.typing import * from hoshino.util import DailyNumberLimiter, FreqLimiter from .searchmaster import SearchMaster from .pixivmaster import * from .musicmaster import * try: import ujson as json except: import json sv = Service('search', help_='[搜图+图片] 以图搜图\n[搜图+关键字] 关键字搜图\n[点歌+关键字] 关键字点歌', bundle='pcr娱乐', enable_on_default=True, visible=True) search_limit = DailyNumberLimiter(15) lmt = FreqLimiter(15) SEARCH_EXCEED_NOTICE = f'你今天搜的图太多辣,欢迎明早5点后再来!' _search_user = {} _search_user = defaultdict(lambda: False, _search_user) async def check_search_num(bot, ev: CQEvent): if not search_limit.check(ev.user_id): await bot.finish(ev, SEARCH_EXCEED_NOTICE, at_sender=True) @sv.on_prefix('佩可搜图') async def search_mode_on(bot, ev: CQEvent):
sv_help = ''' [今天吃什么] 看看今天吃啥 '''.strip() sv = Service( name='今天吃什么', #功能名 use_priv=priv.NORMAL, #使用权限 manage_priv=priv.ADMIN, #管理权限 visible=True, #可见性 enable_on_default=True, #默认启用 bundle='娱乐', #分组归类 help_=sv_help #帮助说明 ) _day_limit = 5 _lmt = DailyNumberLimiter(_day_limit) def get_foods(): if os.path.exists(os.path.join(os.path.dirname(__file__), 'foods.json')): with open(os.path.join(os.path.dirname(__file__), 'foods.json'), "r", encoding='utf-8') as dump_f: try: words = json.load(dump_f) except Exception as e: hoshino.logger.error(f'读取食谱时发生错误{type(e)}') return None else: hoshino.logger.error(f'目录下未找到食谱') keys = list(words.keys())
import ujson as json except: import json sv_help = ''' [凯露来发十连] 转蛋模拟 [凯露来发单抽] 转蛋模拟 [凯露来一井] 4w5钻! [凯露抽签] 随机获得/减少宝石 [凯露宝石] 查看剩余宝石 [查看卡池] 模拟卡池&出率 [切换卡池] 更换模拟卡池 ※宝石用于限制每日单抽/十连模拟的次数 '''.strip() sv = Service('gacha', help_=sv_help, bundle='pcr娱乐') jewel_limit = DailyNumberLimiter(4500) tenjo_limit = DailyNumberLimiter(10) lmtw = DailyNumberLimiter(1) JEWEL_EXCEED_NOTICE = f'别抽力别抽力,您今天已经抽过{jewel_limit.max}钻了,欢迎明早5点后再来!' TENJO_EXCEED_NOTICE = f'真当您是母猪了?您今天已经抽过{tenjo_limit.max}张天井券了,欢迎明早5点后再来!' SWITCH_POOL_TIP = '※发送"选择卡池"可切换' 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:
from .gacha import Gacha try: import ujson as json except: import json _j_limit = 93300 #每日钻石上限 _r_limit = 1 #白嫖次数上限 _rf_limit = 3 #日偷钻人数上限 gacha_jewel_data = os.path.abspath('hoshino/modules/priconne/data/gacha_jewel_data.json') gacha_rst_data = os.path.abspath('hoshino/modules/priconne/data/gacha_rst_data.json') gacha_rstf_data = os.path.abspath('hoshino/modules/priconne/data/gacha_rstf_data.json') jewel_limit = DailyNumberLimiter(_j_limit, gacha_jewel_data) rst_limit = DailyNumberLimiter(_r_limit, gacha_rst_data) rstf_limit = DailyNumberLimiter(_rf_limit, gacha_rstf_data) dbfile = os.path.abspath('hoshino/modules/priconne/data/signindata') cdb = Commic_DB(dbfile) sv_help = f''' 模拟扭蛋 [@bot来发十连] 扭蛋单抽模拟 [@bot来发单抽] 扭蛋十连模拟 [@bot来一井] 4w5钻! [帮助抽卡] 获取详细使用说明 '''.strip() sv_help_detail = f'''
import time import traceback from decimal import Decimal from typing import List, Tuple import nonebot from peewee import PeeweeException from hoshino.config.score import global_score from hoshino.util import DailyNumberLimiter from hoshino.util.database import (DataBaseException, NotEnoughScoreError, ScoreLimitExceededError, database, score_data, score_log) score_get_limiter = DailyNumberLimiter(global_score.DAILY_SCORE_GET_LIMIT) score_spend_limiter = DailyNumberLimiter(global_score.DAILY_SCORE_SPEND_LIMIT) class Score: """ 积分操作类,包括: - get_score:获取积分数额 - check_score:检查积分数额 - add_score:增加积分(原子操作) - spend_score:消费积分(原子操作) - give_score:给予积分(原子操作) - (异步)score_log:获取积分日志 - (异步)score_rank:获取本群积分排行 有返回值时即为成功操作。 操作失败时会返回以下异常:
csvpath = os.path.join(os.path.abspath(os.path.dirname(__file__)), 'data') picpath = os.path.join(os.path.expanduser(RES_DIR), 'img','bangdreampic') sv_help = ''' [邦邦十连 (卡池编号)] 十连抽卡模拟,若未输入卡池编号则随机选取 [邦邦天井 (卡池编号)] 天井抽卡模拟 [查询邦邦卡池 (卡池编号)] 查询卡池信息 '''.strip() sv = Service('bangdream-gacha', help_=sv_help) EXCEED_NOTICE = f'您今天已经抽过10000星石了,请明早5点后再来~' EXCEED_NOTICE2 = f'您今天已经抽过一井了,请明早5点后再来~' _nlmt = DailyNumberLimiter(4) _tlmt = DailyNumberLimiter(1) _flmt = FreqLimiter(10) def csv_to_dict(file_name): outdict={} flist = list(csv.reader(open(file_name,'r',encoding="utf-8"))) for i in range(1,len(flist)): row=flist[i] outdict[row[0]]=row return outdict card_dict = csv_to_dict(os.path.join(csvpath, 'bang_card.csv'))
from hoshino import Service,priv from .gacha import gacha_info , FILE_PATH , Gacha , POOL import os import json from hoshino.util import DailyNumberLimiter from ..config import Gacha10Limit,Gacha90Limit,Gacha180Limit daily_limiter_10 = DailyNumberLimiter(Gacha10Limit) daily_limiter_90 = DailyNumberLimiter(Gacha90Limit) daily_limiter_180 = DailyNumberLimiter(Gacha180Limit) sv = Service('原神抽卡') group_pool = { # 这个字典保存每个群对应的卡池是哪个,群号字符串为key,卡池名为value,群号不包含在字典key里卡池按默认DEFAULT_POOL } def save_group_pool(): with open(os.path.join(FILE_PATH,'gid_pool.json'),'w',encoding='UTF-8') as f: json.dump(group_pool,f,ensure_ascii=False) # 检查gid_pool.json是否存在,没有创建空的 if not os.path.exists(os.path.join(FILE_PATH,'gid_pool.json')): save_group_pool() # 读取gid_pool.json的信息
import hoshino from hoshino import Service, log, priv from hoshino.typing import CQEvent from hoshino.util import DailyNumberLimiter from hoshino.config import NICKNAME from aiocqhttp.exceptions import ActionFailed from .image import get_image_data_sauce, get_image_data_ascii, check_screenshot from .config import threshold, SAUCENAO_KEY, SEARCH_TIMEOUT, CHAIN_REPLY, DAILY_LIMIT, helptext, CHECK, enableguild, IGNORE_STAMP if type(NICKNAME) == str: NICKNAME = [NICKNAME] sv = Service('picfinder', help_=helptext) lmtd = DailyNumberLimiter(DAILY_LIMIT) logger = log.new_logger('image') class PicListener: def __init__(self): self.on = {} self.count = {} self.limit = {} self.timeout = {} def get_on_off_status(self, gid): return self.on[gid] if self.on.get(gid) is not None else False def turn_on(self, gid, uid): self.on[gid] = uid
help_='[@bot赛跑模拟]模拟来一局赛🐎') _pool_config_file = os.path.expanduser('~/.hoshino/group_pool_config.json') _group_pool = {} POOL = ('MIX', 'JP', 'TW', 'BL') DEFAULT_POOL = POOL[0] try: with open(_pool_config_file, encoding='utf8') as f: _group_pool = json.load(f) except FileNotFoundError as e: sv.logger.warning( 'group_pool_config.json not found, will create when needed.') _group_pool = defaultdict(lambda: DEFAULT_POOL, _group_pool) lmt = DailyNumberLimiter(5) special_object = ['🙉', '💧', '🗿', '🎂'] numb = ['1️⃣', '2️⃣', '3️⃣', '4️⃣'] class Palyer(object): def __init__(self, pool_name: str = "MIX"): super().__init__() self.load_chara(pool_name) def load_chara(self, pool_name: str): config = util.load_config(__file__) pool = config[pool_name] self.player = pool["player"]
from logging import getLogger from typing import List from .product import product from .backend import backend, balance from math import ceil, floor import random from hoshino.util import DailyNumberLimiter check_lmt = DailyNumberLimiter(1) class manager: @staticmethod def _tax_cost(origin): return 0.003 * origin @staticmethod def _format_num(x): x = float(x) if x >= 1000: return f'{x:.1f}' else: return f'{x:.4}' @staticmethod def _format_cost(origin): tax = manager._tax_cost(origin) cost = ceil(origin + tax) return f'{cost}金币' + (f'(含税{manager._format_num(tax)}金币)' if tax > 0 else 0)
import os import random from nonebot.exceptions import CQHttpError from hoshino import R, Service, priv from hoshino.util import FreqLimiter, DailyNumberLimiter _max = 10 EXCEED_NOTICE = f'您今天已经冲过{_max}次了,请明早5点后再来!' _nlmt = DailyNumberLimiter(_max) _flmt = FreqLimiter(5) sv = Service('setu', manage_priv=priv.SUPERUSER, enable_on_default=True, visible=False) 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)): yield R.img('setu/', filename) setu_gener = setu_gener() def get_setu(): return setu_gener.__next__() @sv.on_rex(r'不够[涩瑟色]|[涩瑟色]图|来一?[点份张].*[涩瑟色]|再来[点份张]|看过了|铜')
import os import re import requests import random from nonebot import on_command, CommandSession, MessageSegment, NoneBot from nonebot.exceptions import CQHttpError from hoshino import R, Service, Privilege from hoshino.util import FreqLimiter, DailyNumberLimiter _max = 5 EXCEED_NOTICE = f'您今天已经冲过{_max}次了,请明早5点后再来!' _nlmt = DailyNumberLimiter(_max) _r18lmt = DailyNumberLimiter(1) _flmt = FreqLimiter(5) sv = Service('setu', manage_priv=Privilege.SUPERUSER, enable_on_default=True, visible=False) 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)): yield R.img('setu/', filename)
#启动一个线程一直补充色图 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
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: