Example #1
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, ''
Example #2
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:
Example #3
0
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)
Example #4
0
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]
Example #6
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)
Example #7
0
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)

Example #9
0
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):
Example #10
0
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())
Example #11
0
    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:
Example #12
0
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'''
Example #13
0
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:获取本群积分排行
    有返回值时即为成功操作。
    操作失败时会返回以下异常:
Example #14
0
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'))
Example #15
0
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的信息
Example #16
0
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
Example #17
0
             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"]
Example #18
0
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)
Example #19
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'不够[涩瑟色]|[涩瑟色]图|来一?[点份张].*[涩瑟色]|再来[点份张]|看过了|铜')
Example #20
0
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
Example #22
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: