Ejemplo n.º 1
0
async def on_query_arena_all(bot, ev):
    global binds, lck

    robj = ev['match']
    id = robj.group(1)
    uid = str(ev['user_id'])

    async with lck:
        if id == None:
            if not uid in binds:
                await bot.finish(ev, '您还未绑定竞技场', at_sender=True)
                return
            else:
                id = binds[uid]['id']
        try:
            res = await query(id)
            sv.logger.info('开始生成竞技场查询图片...') # 通过log显示信息
            # result_image = await generate_info_pic(res, cx)
            result_image = await generate_info_pic(res, uid)
            result_image = pic2b64(result_image) # 转base64发送,不用将图片存本地
            result_image = MessageSegment.image(result_image)
            result_support = await generate_support_pic(res, uid)
            result_support = pic2b64(result_support) # 转base64发送,不用将图片存本地
            result_support = MessageSegment.image(result_support)
            sv.logger.info('竞技场查询图片已准备完毕!')
            try:
                await bot.finish(ev, f"\n{str(result_image)}\n{result_support}", at_sender=True)
            except Exception as e:
                sv.logger.info("do nothing")
        except ApiException as e:
            await bot.finish(ev, f'查询出错,{e}', at_sender=True)
async def neurasthenia_game(bot, ev: CQEvent):
    if gm.is_playing(ev.group_id):
        await bot.finish(ev, "游戏仍在进行中…")
    with gm.start_game(ev.group_id) as game:
        chosen_ids = random.sample(game_util.VALID_IDS, TOTAL_PIC_NUM // 2)
        chosen_ids.extend(chosen_ids)
        random.shuffle(chosen_ids)
        # 记忆阶段
        await bot.send(ev, f'记忆阶段: ({SHOW_TIME}s后我会撤回图片哦~)')
        pic = MessageSegment.image(util.pic2b64(game_util.generate_full_pic(ROW_NUM, COL_NUM, chosen_ids)))
        msg = await bot.send(ev, pic)
        await asyncio.sleep(SHOW_TIME)
        await bot.delete_msg(message_id=msg['message_id'])
        await asyncio.sleep(2)
        # 回答阶段
        displayed_sub_pic_index = random.randint(0, TOTAL_PIC_NUM - 1)
        chosen_id = chosen_ids[displayed_sub_pic_index]
        explanation = game_util.EXPLANATION[chosen_id]
        ids = [game_util.JUMP_ID if i != displayed_sub_pic_index else id for i, id in enumerate(chosen_ids)]
        pic = MessageSegment.image(util.pic2b64(game_util.generate_full_pic(ROW_NUM, COL_NUM, ids, True)))
        await bot.send(ev, f'请告诉我另一个"{explanation}"所在位置的编号~ ({ANSWER_TIME}s后公布答案){pic}')
        game.answer = [i for i, id in enumerate(chosen_ids) if i != displayed_sub_pic_index and id == chosen_id][0] + 1
        await asyncio.sleep(ANSWER_TIME)
        # 结算
        game.update_score()
        msg_part1 = f'{MessageSegment.at(game.winner[0])}首先答对,真厉害~ 加2分! 当前总分为{game.get_first_winner_score()}分' if game.winner else ''
        msg_part2 = f'{game_util.generate_at_message_segment(game.winner[1:])}也答对了, 加1分~' if game.winner[1:] else ''
        msg_part3 = f'{game_util.generate_at_message_segment(game.loser)}答错了, 扣1分o(╥﹏╥)o' if game.loser else ''
        msg_part4 = '咦, 这轮游戏没人参与, 看来题目可能有点难...' if not (msg_part1 or msg_part2 or msg_part3) else ""
        msg_part = '\n'.join([s for s in [msg_part1, msg_part2, msg_part3, msg_part4] if s])
        await bot.send(ev, f'正确答案是: {game.answer}{MessageSegment.image(util.pic2b64(game_util.generate_full_pic(ROW_NUM, COL_NUM, chosen_ids)))}{msg_part}')
Ejemplo n.º 3
0
async def ss_rate(bot, ev):
    txt = ev.message.extract_plain_text().strip()
    if not txt:
        await bot.finish(ev, '请在后面跟部位:头/身/腰/手', at_sender=True)
    pos = "0"
    if txt == "头":
        pos = "1"
    elif txt == "身":
        pos = "2"
    elif txt == "腰":
        pos = "3"
    elif txt == "手":
        pos = "4"

    if pos == "0":
        await bot.finish(ev, '请在后面跟部位:头/身/腰/手', at_sender=True)
    r = random.randint(1, 100)
    splv = 0 if r < 80 else (1 if r < 99 else 2)
    sppool = [x for x in ssrsp if x["position"] == pos and x["lv"] == splv]
    if len(sppool) <= 0:
        await bot.finish(ev, '出错了,获取饰品数据失败', at_sender=True)

    sp = random.choice(sppool)
    #生成饰品图片
    sppic = makePic(sp)
    res = pic2b64(sppic)
    await bot.finish(ev, f'\n{ms.image(res)}', at_sender=True)
Ejemplo n.º 4
0
def get_icons(arr,size=64,types='skill'):
    num = len(arr)
    des = Image.new('RGBA', (num*size, size), (255, 255, 255, 255))
    for i, chara in enumerate(arr):
        pic = icon(chara,types).open().convert('RGBA').resize((size, size), Image.LANCZOS)
        des.paste(pic, (i * size, 0), pic)
    return str(MessageSegment.image(pic2b64(des)))
Ejemplo n.º 5
0
    async def add_repass(self, tag: str, data):
        po = "——{}——".format(tag)
        for line in data:
            if THUMB_ON:
                try:
                    #thumbnail_image = str(MessageSegment.image(pic2b64(ats_pic(Image.open(BytesIO(await get_pic(line[2])))))))
                    thumbnail_image = str(
                        MessageSegment.image(
                            pic2b64(
                                ats_pic(
                                    Image.open(
                                        BytesIO(
                                            self.scraper.get(
                                                line[2],
                                                timeout=20,
                                                proxies=proxies).content))))))
                except Exception as e:
                    print(format_exc())
                    thumbnail_image = "[预览图下载失败]"
            else:
                thumbnail_image = ""
            putline = f"{thumbnail_image}\n[{line[1]}][{line[0]}]\n{line[3]}"
            po = "\n".join([po, putline])

        return po
Ejemplo n.º 6
0
async def longwang(session):
    global imgbase_path
    uid = session.ctx['user_id']
    if not _nlmt.check(uid):
        await session.send(EXCEED_NOTICE, at_sender=True)
        return
    if not _flmt.check(uid):
        await session.send('龙王她生气了,并堵上了你的嘴', at_sender=True)
        return
    _flmt.start_cd(uid)
    gid = session.ctx['group_id']
    dragon_king = await session.bot.get_group_honor_info(group_id=gid,
                                                         type='talkative')
    if not 'current_talkative' in dragon_king:
        await session.send('本群暂时还没有龙王哦……', at_sender=True)
        return
    dragon_king = dragon_king['current_talkative']['user_id']
    dir_list = os.listdir(imgbase_path)
    img_path = path.join(imgbase_path, random.choice(dir_list))
    count = 0
    while os.path.isdir(img_path) == True:
        img_path = path.join(imgbase_path, random.choice(dir_list))
        count += 1
        if count % 5 == 0:
            hoshino.logger.error('缺少龙王图片资源或目录下文件夹过多')
            return
    longwang_img = R.img(img_path).open()
    longwang_img_message = MessageSegment.image(pic2b64(longwang_img))
    reply = random.choice(['龙王出来挨透', '龙王出来喷水'])
    _nlmt.increase(uid)
    await session.finish(
        f'[CQ:at,qq={dragon_king}]\n{reply}\n{longwang_img_message}')
Ejemplo n.º 7
0
async def tip(poolid="1"):
    poolinfo = pool_dict[poolid]
    pooltype = poolinfo[2]
    name = poolinfo[1]
    pic = pic2b64(Image.open(os.path.join(picpath,"pool",f"{poolid}.png")))
    pic = MessageSegment.image(pic)
    return f"卡池{poolid}[{name}]\n{pic}\n米歇尔祈愿中..."
Ejemplo n.º 8
0
def get_random_cards(card_file_names_list=card_file_names_all, amount=1):
    card_ids = []
    size = 80
    margin = 5
    col_num = math.ceil(amount / 2)
    row_num = 2 if amount != 1 else 1
    base = Image.new('RGBA', (col_num * size + (col_num - 1) * margin,
                              (row_num * size + (row_num - 1) * margin)),
                     (255, 255, 255, 255))
    rarity_counter = {-1: 0, 0: 0, 1: 0}
    for i in range(amount):
        random_card = random.choice(
            card_file_names_list
        ) if card_file_names_list != card_file_names_all else random.choice(
            get_random_cards_list())
        card_id, rarity = get_card_id_by_file_name(random_card)
        card_ids.append(card_id)
        rarity_counter[rarity] += 1
        if PRELOAD:
            img = image_cache[random_card]
        else:
            img = Image.open(DIR_PATH + f'/{random_card}')
        row_index = i // col_num
        col_index = i % col_num
        img = img.resize((size, size), Image.ANTIALIAS)
        base.paste(add_rarity_frame(img, rarity),
                   (col_index * (size + margin), row_index * (size + margin)))
    return card_ids, rarity_counter, MessageSegment.image(util.pic2b64(base))
Ejemplo n.º 9
0
async def gacha_10(bot, ev: CQEvent):
    SUPER_LUCKY_LINE = 170

    await check_jewel_num(bot, ev)
    jewel_limit.increase(ev.user_id, 1500)

    gid = str(ev.group_id)
    gacha = Gacha(_group_pool[gid])
    result, hiishi = gacha.gacha_ten()
    silence_time = hiishi * 6 if hiishi < SUPER_LUCKY_LINE else hiishi * 60

    res1 = chara.gen_team_pic(result[:5], star_slot_verbose=False)
    res2 = chara.gen_team_pic(result[5:], star_slot_verbose=False)
    res = concat_pic([res1, res2])
    res = pic2b64(res)
    res = MessageSegment.image(res)
    result = [f'{c.name}{"★"*c.star}' for c in result]
    res1 = ' '.join(result[0:5])
    res2 = ' '.join(result[5:])
    res = f'{res}\n{res1}\n{res2}'
    # 纯文字版
    # result = [f'{c.name}{"★"*c.star}' for c in result]
    # res1 = ' '.join(result[0:5])
    # res2 = ' '.join(result[5:])
    # res = f'{res1}\n{res2}'

    if hiishi >= SUPER_LUCKY_LINE:
        await bot.send(ev, '恭喜海豹!おめでとうございます!')
    await bot.send(ev, f'素敵な仲間が増えますよ!\n{res}\n', at_sender=True)
    await silence(ev, silence_time)
Ejemplo n.º 10
0
async def avatar_guess(bot, ev: CQEvent):
    if winner_judger.get_on_off_status(ev.group_id):
        await bot.send(ev, "此轮游戏还没结束,请勿重复使用指令")
        return
    winner_judger.turn_on(ev.group_id)
    chara_id_list = list(_pcr_data.CHARA_NAME.keys())
    list_len = len(chara_id_list) - 1
    while True:
        index = random.randint(0, list_len)
        if chara_id_list[index] not in BLACKLIST_ID: break
    winner_judger.set_correct_chara_id(ev.group_id, chara_id_list[index])
    dir_path = os.path.join(os.path.expanduser(hoshino.config.RES_DIR), 'img', 'priconne', 'unit')
    if not os.path.exists(dir_path):
        os.makedirs(dir_path)
    c = chara.fromid(chara_id_list[index])
    img = c.icon.open()
    left = math.floor(random.random()*(129-PIC_SIDE_LENGTH))
    upper = math.floor(random.random()*(129-PIC_SIDE_LENGTH))
    cropped = img.crop((left, upper, left+PIC_SIDE_LENGTH, upper+PIC_SIDE_LENGTH))
    cropped = MessageSegment.image(util.pic2b64(cropped))
    msg = f'猜猜这个图片是哪位角色头像的一部分?({ONE_TURN_TIME}s后公布答案){cropped}'
    await bot.send(ev, msg)
    await asyncio.sleep(ONE_TURN_TIME)
    if winner_judger.get_winner(ev.group_id) != '':
        winner_judger.turn_off(ev.group_id)
        return
    msg =  f'正确答案是: {c.name}{c.icon.cqcode}\n很遗憾,没有人答对~'
    winner_judger.turn_off(ev.group_id)
    await bot.send(ev, msg)
Ejemplo n.º 11
0
async def jc(bot, ev: CQEvent):
    kw = ev.message.extract_plain_text().strip()
    arr = kw.split('/')
    image = Image.open(os.path.join(os.path.dirname(__file__),'jichou.jpg'))
    # 创建Font对象:
    font = ImageFont.truetype(os.path.join(os.path.dirname(__file__),'simhei.ttf'), 80)
    
    time = datetime.datetime.now().strftime('%Y年%m月%d日')
    msg = f'{time},{arr[0]},{arr[1]},这个仇我先记下了'
    place = 12
    line = len(msg.encode('utf-8')) // place + 1

    positions = measure(msg, 80, 974)
    str_list = list(msg)
    for pos in positions:
        str_list.insert(pos,'\n')
    msg = "".join(str_list)   
    # 创建Draw对象:
    image_text = Image.new('RGB', (974, 32 * line), (255, 255, 255))
    draw = ImageDraw.Draw(image_text)
    draw.text((0, 0), msg, fill=(0 , 0, 0), font=font)
    # 模糊:
    image_text = image_text.filter(ImageFilter.BLUR)
    image_back = Image.new('RGB', (974, 32 * line + 764), (255, 255, 255))
    image_back.paste(image, (0, 0))
    image_back.paste(image_text, (0, 764))
    
    await bot.send(ev, str(MessageSegment.image(pic2b64(image_back))))
Ejemplo n.º 12
0
async def pcr_comp(bot, ev: CQEvent):
    global g_result, g_uid
    uid = ev.user_id
    if not lmt.check(uid):
        await bot.send(ev, '今天已经赛过5次力', at_sender=True)
        return
    if g_result != []:
        await bot.send(ev,
                       '上一场比赛尚未结束,请等待\n※管理员发送“@bot赛跑重置”可重置比赛',
                       at_sender=True)
        return
    lmt.increase(uid)
    await bot.send(ev, f'第○届兰德索尔杯比赛开始!', at_sender=True)
    gid = str(ev.group_id)
    palyer = Palyer(_group_pool[gid])
    result = palyer.get_chara()
    result_number = palyer.get_num()
    res2 = chara.gen_team_pic(result, star_slot_verbose=False)
    res1 = chara.gen_team_pic(result_number, star_slot_verbose=False)
    res = concat_pic([res1, res2])
    res = pic2b64(res)
    res = MessageSegment.image(res)
    result_name = [f'{c.name}' for c in result]
    res_name = ' '.join(result_name)
    if sv.bot.config.USE_CQPRO:
        await bot.send(ev,
                       f'比赛选手:\n{res}\n{res_name}\n※发送“选中+角色名称”开始比赛',
                       at_sender=False)
    else:
        await bot.send(ev, f'error:CQpro is required')
    save_player(result_name)
    g_uid = uid
Ejemplo n.º 13
0
async def gacha_10(session: CommandSession):
    SUPER_LUCKY_LINE = 170
    uid = session.ctx['user_id']
    at = str(MessageSegment.at(session.ctx['user_id']))

    if not check_gacha_num(uid):
        await session.finish(f'{at} {GACHA_EXCEED_NOTICE}')
    _user_gacha_count[uid] += 1

    gacha = Gacha()
    result, hiishi = gacha.gacha_ten()
    silence_time = hiishi * 6 if hiishi < SUPER_LUCKY_LINE else hiishi * 60

    if get_bot().config.IS_CQPRO:
        res1 = Chara.gen_team_pic(result[:5], star_slot_verbose=False)
        res2 = Chara.gen_team_pic(result[5:], star_slot_verbose=False)
        res = concat_pic([res1, res2])
        res = pic2b64(res)
        res = MessageSegment.image(res)
        result = [f'{c.name}{"★"*c.star}' for c in result]
        res1 = ' '.join(result[0:5])
        res2 = ' '.join(result[5:])
        res = res + f'{res1}\n{res2}'
    else:
        result = [f'{c.name}{"★"*c.star}' for c in result]
        res1 = ' '.join(result[0:5])
        res2 = ' '.join(result[5:])
        res = f'{res1}\n{res2}'

    await silence(session.ctx, silence_time)
    msg = f'{at}\n素敵な仲間が増えますよ!\n{res}'
    await session.send(msg)
    if hiishi >= SUPER_LUCKY_LINE:
        await session.send('恭喜海豹!おめでとうございます!')
Ejemplo n.º 14
0
async def gacha_10(session:CommandSession):
    SUPER_LUCKY_LINE = 170

    await check_jewel_num(session)
    uid = session.ctx['user_id']
    jewel_limit.increase(uid, 1500)

    gid = str(session.ctx['group_id'])
    gacha = Gacha(_group_pool[gid])
    result, hiishi = gacha.gacha_ten()
    silence_time = hiishi * 6 if hiishi < SUPER_LUCKY_LINE else hiishi * 60

    if sv.bot.config.IS_CQPRO:
        res1 = Chara.gen_team_pic(result[:5], star_slot_verbose=False)
        res2 = Chara.gen_team_pic(result[5:], star_slot_verbose=False)
        res = concat_pic([res1, res2])
        res = pic2b64(res)
        res = MessageSegment.image(res)
        result = [f'{c.name}{"★"*c.star}' for c in result]
        res1 = ' '.join(result[0:5])
        res2 = ' '.join(result[5:])
        res = f'{res}\n{res1}\n{res2}'
    else:
        result = [f'{c.name}{"★"*c.star}' for c in result]
        res1 = ' '.join(result[0:5])
        res2 = ' '.join(result[5:])
        res = f'{res1}\n{res2}'

    if hiishi >= SUPER_LUCKY_LINE:
        await session.send('恭喜海豹!おめでとうございます!')
    await session.send(f'素敵な仲間が増えますよ!\n{res}\n{SWITCH_POOL_TIP}', at_sender=True)
    await silence(session.ctx, silence_time)
Ejemplo n.º 15
0
async def gacha_10(bot, ev: CQEvent):
    SUPER_LUCKY_LINE = 170
    SUPER_BAD_LUCK = 19

    await check_jewel_num(bot, ev)
    jewel_limit.increase(ev.user_id, 1500)

    gid = str(ev.group_id)
    gacha = Gacha(_group_pool[gid])
    result, hiishi = gacha.gacha_ten()
    silence_time = 240 if hiishi < SUPER_LUCKY_LINE else 400

    if sv.bot.config.USE_CQPRO:
        res1 = chara.gen_team_pic(result[:5], star_slot_verbose=False)
        res2 = chara.gen_team_pic(result[5:], star_slot_verbose=False)
        res = concat_pic([res1, res2])
        res = pic2b64(res)
        res = MessageSegment.image(res)
        result = [f'{c.name}{"★"*c.star}' for c in result]
        res1 = ' '.join(result[0:5])
        res2 = ' '.join(result[5:])
        res = f'{res}\n{res1}\n{res2}'
    else:
        result = [f'{c.name}{"★"*c.star}' for c in result]
        res1 = ' '.join(result[0:5])
        res2 = ' '.join(result[5:])
        res = f'{res1}\n{res2}'

    if hiishi >= SUPER_LUCKY_LINE:
        await bot.send(ev, '恭喜海豹!')
    elif hiishi <= SUPER_BAD_LUCK:
        await bot.send(ev, '世 界 名 画')
    await bot.send(ev, f'优秀的伙伴增加了!\n{res}\n', at_sender=True)
Ejemplo n.º 16
0
async def gacha_300(bot, ev: CQEvent):

    await check_tenjo_num(bot, ev)
    tenjo_limit.increase(ev.user_id)

    gid = str(ev.group_id)
    gacha = Gacha(_group_pool[gid])
    result = gacha.gacha_tenjou()
    up = len(result['up'])
    s3 = len(result['s3'])
    s2 = len(result['s2'])
    s1 = len(result['s1'])

    res = [*(result['up']), *(result['s3'])]
    random.shuffle(res)
    lenth = len(res)
    if lenth <= 0:
        res = "竟...竟然没有3★?!"
    else:
        step = 4
        pics = []
        for i in range(0, lenth, step):
            j = min(lenth, i + step)
            pics.append(chara.gen_team_pic(res[i:j], star_slot_verbose=False))
        res = concat_pic(pics)
        res = pic2b64(res)
        res = MessageSegment.image(res)

    msg = [
        f"\n素敵な仲間が増えますよ! {res}", f"★★★×{up+s3} ★★×{s2} ★×{s1}",
        f"\n发送"选择卡池"可以切换卡池\n管理员发送"氪金+@你本人",可以再抽一次",
        f"获得记忆碎片×{100*up}与女神秘石×{50*(up+s3) + 10*s2 + s1}!\n第{result['first_up_pos']}抽首次获得up角色"
        if up else f"获得女神秘石{50*(up+s3) + 10*s2 + s1}个!"
    ]

    if up == 0 and s3 == 0:
        msg.append("太惨了,咱们还是退款删游吧...")
    elif up == 0 and s3 > 7:
        msg.append("up呢?我的up呢?")
    elif up == 0 and s3 <= 3:
        msg.append("这位酋长,梦幻包考虑一下?")
    elif up == 0:
        msg.append("据说天井的概率只有12.16%")
    elif up <= 2:
        if result['first_up_pos'] < 50:
            msg.append("你的喜悦我收到了,滚去喂鲨鱼吧!")
        elif result['first_up_pos'] < 100:
            msg.append("已经可以了,您已经很欧了")
        elif result['first_up_pos'] > 290:
            msg.append("标 准 结 局")
        elif result['first_up_pos'] > 250:
            msg.append("补井还是不补井,这是一个问题...")
        else:
            msg.append("期望之内,亚洲水平")
    elif up == 3:
        msg.append("抽井母五一气呵成!多出30等专武~")
    elif up >= 4:
        msg.append("记忆碎片一大堆!您是托吧?")

    await bot.send(ev, '\n'.join(msg), at_sender=True)
Ejemplo n.º 17
0
async def friend(bot, ev: CQEvent):
    # 定义非管理员的冷却时间
    # if ev.user_id not in bot.config.SUPERUSERS:
    # if not _flmt.check(ev.user_id):
    # return
    # _flmt.start_cd(ev.user_id)
    data = load_config(os.path.join(os.path.dirname(__file__),
                                    'config.json'))['friend']
    arr = []
    is_at = False
    for m in ev.message:
        if m.type == 'at' and m.data['qq'] != 'all':
            arr = [int(m.data['qq'])]
            sid = int(m.data['qq'])
            is_at = True
    if not is_at:
        try:
            arr = data[f'{ev.group_id}']
        except:
            member_list = await bot.get_group_member_list(self_id=ev.self_id,
                                                          group_id=ev.group_id)
            for member in member_list:
                arr.append(member['user_id'])
            sid = choice(arr)
    info = await bot.get_group_member_info(group_id=ev.group_id,
                                           user_id=sid,
                                           no_cache=True)
    name = info['card'] or info['nickname']
    match = ev['match']
    msg = match.group('kw')
    msg = msg.replace('他', '我').replace('她', '我')
    image = Image.open(BytesIO(get_pic(sid)))
    img_origin = Image.new('RGBA', (100, 100), (255, 255, 255))
    scale = 3
    # 使用新的半径构建alpha层
    r = 100 * scale
    alpha_layer = Image.new('L', (r, r), 0)
    draw = ImageDraw.Draw(alpha_layer)
    draw.ellipse((0, 0, r, r), fill=255)
    # 使用ANTIALIAS采样器缩小图像
    alpha_layer = alpha_layer.resize((100, 100), Image.ANTIALIAS)
    img_origin.paste(image, (0, 0), alpha_layer)

    # 创建Font对象:
    font = ImageFont.truetype(
        os.path.join(os.path.dirname(__file__), 'simhei.ttf'), 30)
    font2 = ImageFont.truetype(
        os.path.join(os.path.dirname(__file__), 'simhei.ttf'), 25)

    # 创建Draw对象:
    image_text = Image.new('RGB', (450, 150), (255, 255, 255))
    draw = ImageDraw.Draw(image_text)
    draw.text((0, 0), name, fill=(0, 0, 0), font=font)
    draw.text((0, 40), msg, fill=(125, 125, 125), font=font2)

    image_back = Image.new('RGB', (700, 150), (255, 255, 255))
    image_back.paste(img_origin, (25, 25))
    image_back.paste(image_text, (150, 40))

    await bot.send(ev, str(MessageSegment.image(pic2b64(image_back))))
Ejemplo n.º 18
0
async def gacha_10(bot, ev: CQEvent):

    await check_jewel_num(bot, ev)
    jewel_limit.increase(ev.user_id, 1500)

    gid = str(ev.group_id)
    gacha = Gacha(_group_pool[gid])
    result = gacha.gacha_ten()

    uid = str(ev.user_id)
    if _colle_enable[uid]:
        await modify_colle(bot, ev, result)

    res1 = chara.gen_team_pic(result[:5], star_slot_verbose=False)
    res2 = chara.gen_team_pic(result[5:], star_slot_verbose=False)
    res = concat_pic([res1, res2])
    res = pic2b64(res)
    res = MessageSegment.image(res)
    result = [f'{c.name}{"★"*c.star}' for c in result]
    res1 = ' '.join(result[0:5])
    res2 = ' '.join(result[5:])
    res = f'{res}\n{res1}\n{res2}'
    # 纯文字版
    # result = [f'{c.name}{"★"*c.star}' for c in result]
    # res1 = ' '.join(result[0:5])
    # res2 = ' '.join(result[5:])
    # res = f'{res1}\n{res2}'

    await bot.send(ev, f'素敵な仲間が増えますよ!\n{res}', at_sender=True)
Ejemplo n.º 19
0
async def diary(bot, ev: CQEvent):
    global pre
    name = '富婆'
    for i in ev.message:
        if i.get('type', False) == 'at':
            name = get_name(i.data['qq'])

    kw = ev.message.extract_plain_text().strip()
    time = datetime.datetime.now().strftime('%Y年%m月%d日')
    arr = kw.split('/')
    content = ''
    if len(arr) >= 2:
        weather, content = arr
        weather = weather.split(' ')[-1]
    else:
        weather = ''
        if arr[0].split(' ') == 2:
            weather = arr[0].split(' ')[-1]

    if not content:
        with open(os.path.join(os.path.dirname(__file__), 'diary_data.json'),
                  'r',
                  encoding='utf-8') as file:
            diaries = json.load(file)
            while True:
                index = random.randint(0, len(diaries) - 1)
                if index != pre:
                    pre = index
                    content = diaries[index]
                    for s in '你她':
                        content = content.replace(s, name)
                    break

    image = Image.open(os.path.join(os.path.dirname(__file__), 'diary.png'))
    img_width, img_height = image.size
    # 创建Font对象:
    font_size = img_width // 18
    font = ImageFont.truetype(
        os.path.join(os.path.dirname(__file__), 'simhei.ttf'), font_size)
    positions = measure(content, font_size, img_width)
    str_list = list(content)
    for pos in positions:
        str_list.insert(pos, '\n')
    # 日期单独一行
    line = len(positions) + 2
    content = f'{time},{weather}\n' + "".join(str_list)
    line_h = font_size + 4
    # 创建Draw对象:
    image_text = Image.new('RGB', (img_width, line_h * line), (255, 255, 255))
    draw = ImageDraw.Draw(image_text)
    draw.text((0, 0), content, fill=(0, 0, 0), font=font, spacing=2)
    # 模糊:
    # image_text = image_text.filter(ImageFilter.BLUR)
    image_back = Image.new('RGB', (img_width, line_h * line + img_height),
                           (255, 255, 255))
    image_back.paste(image, (0, 0))
    image_back.paste(image_text, (0, img_height))

    await bot.send(ev, str(MessageSegment.image(pic2b64(image_back))))
Ejemplo n.º 20
0
def infos2pic(infos: List[dict]) -> str:
    texts = []
    for info in infos:
        text = f"标题: {info['标题']}\n时间: {info['时间']}\n======"
        texts.append(text)
    texts = '\n'.join(texts)
    base = text2pic(texts, font)
    return pic2b64(base)
Ejemplo n.º 21
0
async def gacha_10(session:CommandSession):
    SUPER_LUCKY_LINE = 170

    await check_jewel_num(session)
    uid = session.ctx['user_id']
    jewel_limit.increase(uid, 1500)
    
    gid=session.ctx['group_id']
    gacha = Gacha(_group_pool[gid])
    result, hiishi = gacha.gacha_ten()
    silence_time = hiishi * 6 if hiishi < SUPER_LUCKY_LINE else hiishi * 60

    cardo = [cardram(),cardram(),cardram(),cardram(),cardram(),cardram(),cardram(),cardram(),cardram(),cardram()]
    if (cardo[0] + cardo[1] + cardo[2] + cardo[3] + cardo[4] + cardo[5] + cardo[6] + cardo[7] + cardo[8] + cardo[9]) == 60:
        cardo[9] = 5
    cardu = [Chara.cardimg(cardo[0]),Chara.cardimg(cardo[1]),Chara.cardimg(cardo[2]),Chara.cardimg(cardo[3]),Chara.cardimg(cardo[4]),Chara.cardimg(cardo[5]),Chara.cardimg(cardo[6]),Chara.cardimg(cardo[7]),Chara.cardimg(cardo[8]),Chara.cardimg(cardo[9])]
    card = Chara.gen_card_pic(cardu, star_slot_verbose=False)
    card = pic2b64(card)
    card = MessageSegment.image(card)

    cardm1 = cardmjs(cardo[0])[0] + cardmjs(cardo[1])[0] + cardmjs(cardo[2])[0] + cardmjs(cardo[3])[0] + cardmjs(cardo[4])[0] + cardmjs(cardo[5])[0] + cardmjs(cardo[6])[0] + cardmjs(cardo[7])[0] + cardmjs(cardo[8])[0] + cardmjs(cardo[9])[0]
    cardm2 = cardmjs(cardo[0])[1] + cardmjs(cardo[1])[1] + cardmjs(cardo[2])[1] + cardmjs(cardo[3])[1] + cardmjs(cardo[4])[1] + cardmjs(cardo[5])[1] + cardmjs(cardo[6])[1] + cardmjs(cardo[7])[1] + cardmjs(cardo[8])[1] + cardmjs(cardo[9])[1]
    cardm3 = cardmjs(cardo[0])[2] + cardmjs(cardo[1])[2] + cardmjs(cardo[2])[2] + cardmjs(cardo[3])[2] + cardmjs(cardo[4])[2] + cardmjs(cardo[5])[2] + cardmjs(cardo[6])[2] + cardmjs(cardo[7])[2] + cardmjs(cardo[8])[2] + cardmjs(cardo[9])[2]
    cardmax = f'获得角色碎片x{cardm1},母猪石x{cardm2},公主之心碎片x{cardm3}'

    if sv.bot.config.IS_CQPRO:
        res1 = Chara.gen_team_pic(result[ :5], star_slot_verbose=False)
        res2 = Chara.gen_team_pic(result[5: ], star_slot_verbose=False)
        res = concat_pic([res1, res2])
        res = pic2b64(res)
        res = MessageSegment.image(res)
        result = [f'{c.name}{"★"*c.star}' for c in result]
        res1 = ' '.join(result[0:5])
        res2 = ' '.join(result[5:])
        res = f'{res}\n{res1}\n{res2}'
    else:
        result = [f'{c.name}{"★"*c.star}' for c in result]
        res1 = ' '.join(result[0:5])
        res2 = ' '.join(result[5:])
        res = f'{res1}\n{res2}'

    if hiishi >= SUPER_LUCKY_LINE:
        await session.send('恭喜海豹!おめでとうございます!')
    await session.send(f'素敵な仲間が増えますよ!\n{res}\n{card}\n{cardmax}', at_sender=True)
    await silence(session.ctx, silence_time)
Ejemplo n.º 22
0
 def cqcode(self) -> MessageSegment:
     if get_bot().config.RESOURCE_URL:
         return MessageSegment.image(self.url)
     else:
         try:
             return MessageSegment.image(pic2b64(self.open()))
         except Exception as e:
             logger.exception(e)
             return MessageSegment.text('[图片]')
Ejemplo n.º 23
0
async def gacha_300(bot, ev: CQEvent):

    await check_tenjo_num(bot, ev)
    tenjo_limit.increase(ev.user_id)

    gid = str(ev.group_id)
    gacha = Gacha(_group_pool[gid])
    result = gacha.gacha_tenjou()
    up = len(result['up'])
    s3 = len(result['s3'])
    s2 = len(result['s2'])
    s1 = len(result['s1'])
    res = result['res']

    lenth = len(res)
    if lenth <= 0:
        res = "竟...竟然没有3★?!"
    else:
        step = 4
        pics = []
        for i in range(0, lenth, step):
            j = min(lenth, i + step)
            pics.append(chara.gen_team_pic(res[i:j], star_slot_verbose=False))
        res = concat_pic(pics)
        res = pic2b64(res)
        res = MessageSegment.image(res)

    msg = [
        f"\n优秀的伙伴增加了! {res}", f"★★★×{up+s3} ★★×{s2} ★×{s1}",
        f"获得女神秘石×{50*(up+s3) + 10*s2 + s1}!\n第{result['first_up_pos']}抽首次获得up角色"
        if up else f"获得女神秘石{50*(up+s3) + 10*s2 + s1}个!"
    ]

    if up == 0 and s3 == 0:
        msg.append("太惨了,咱们还是退款删游吧...")
    elif up == 0 and s3 > 7:
        msg.append("up呢?我的up呢?")
    elif up == 0 and s3 <= 3:
        msg.append("这位酋长,梦幻包考虑一下?")
    elif up == 0:
        msg.append("据说天井的概率只有12.16%")
    else:
        if result['first_up_pos'] < 50:
            msg.append("你的喜悦我收到了,滚去喂鲨鱼吧!")
        elif result['first_up_pos'] < 100:
            msg.append("已经可以了,您已经很欧了")
        elif result['first_up_pos'] > 290:
            msg.append("标 准 结 局")
        elif result['first_up_pos'] > 250:
            msg.append("补井还是不补井,这是一个问题...")
        else:
            msg.append("期望之内,亚洲水平")

    await bot.send(ev, '\n'.join(msg), at_sender=True)
    silence_time = 1200
Ejemplo n.º 24
0
async def upload(ss: CommandSession):
    atk_team = ss.get('atk_team', prompt='请输入进攻队+5个表示星级的数字+5个表示专武的0/1 无需空格')
    def_team = ss.get('def_team', prompt='请输入防守队+5个表示星级的数字+5个表示专武的0/1 无需空格')
    if 'pic' not in ss.state:
        ss.state['pic'] = MessageSegment.image(pic2b64(concat_pic([
            chara.gen_team_pic(atk_team),
            chara.gen_team_pic(def_team),
        ])))
    confirm = ss.get('confirm', prompt=f'{ss.state["pic"]}\n{MessageSegment.at(ss.event.user_id)}确认上传?\n> 确认\n> 取消')
    # TODO: upload
    await ss.send('假装上传成功了...')
Ejemplo n.º 25
0
 def cqcode(self) -> MessageSegment:
     if hoshino.config.RES_PROTOCOL == 'http':
         return MessageSegment.image(self.url)
     elif hoshino.config.RES_PROTOCOL == 'file':
         return MessageSegment.image(f'file:///{os.path.abspath(self.path)}')
     else:
         try:
             return MessageSegment.image(util.pic2b64(self.open()))
         except Exception as e:
             hoshino.logger.exception(e)
             return MessageSegment.text('[图片出错]')
Ejemplo n.º 26
0
async def avatar_find(bot, ev: CQEvent):
    if gm.is_playing(ev.group_id):
        await bot.finish(ev, "游戏仍在进行中…")
    with gm.start_game(ev.group_id) as game:
        game.answer, answer_pic = get_merge_avatar()
        answer_pic = MessageSegment.image(util.pic2b64(answer_pic))
        await bot.send(ev, f'请找出不一样的头像坐标?({ONE_TURN_TIME}s后公布答案){answer_pic}')
        await asyncio.sleep(ONE_TURN_TIME)
        if game.winner:
            return
    await bot.send(ev, f'正确答案是: {game.answer}\n很遗憾,没有人答对~')
Ejemplo n.º 27
0
def info2pic(info: dict) -> str:
    title = f"标题: {info['标题']}\n"
    text = f"正文:\n{info['正文']}\n时间: {info['时间']}"
    titlesize = get_text_size(title, font2,(20,20,20,0))
    textsize = get_text_size(text, font1,(20,20,10,10))
    sumsize = max(titlesize[0], textsize[0]), titlesize[1]+textsize[1]
    base = Image.new('RGBA', sumsize, (255, 255, 255, 255))
    titlepic = text2pic(title, font2,(20,20,20,0))
    base.paste(titlepic, (0, 0))
    textpic = text2pic(text, font1,(20,20,10,20))
    base.paste(textpic, (0, titlesize[1]))
    return pic2b64(base)
Ejemplo n.º 28
0
def drawing_pic(model) -> Image:
    fontPath = {
        'title': R.img('genshintunedata/font/Mamelon.otf').path,
        'text': R.img('genshintunedata/font/sakura.ttf').path
    }

    if model == 'KELI':
        base_img = get_base_by_name("frame_1.png")
    elif model == 'TWINS':
        base_img = get_base_by_name('frame_42.png')
    else:
        base_img = random_Basemap()

    filename = os.path.basename(base_img.path)
    charaid = filename.lstrip('frame_')
    charaid = charaid.rstrip('.png')

    img = base_img.open()
    # Draw title
    draw = ImageDraw.Draw(img)
    text, title = get_info(charaid)

    text = text['content']
    font_size = 45
    color = '#F5F5F5'
    image_font_center = (140, 99)
    ttfront = ImageFont.truetype(fontPath['title'], font_size)
    font_length = ttfront.getsize(title)
    draw.text((image_font_center[0] - font_length[0] / 2,
               image_font_center[1] - font_length[1] / 2),
              title,
              fill=color,
              font=ttfront)
    # Text rendering
    font_size = 25
    color = '#323232'
    image_font_center = [140, 297]
    ttfront = ImageFont.truetype(fontPath['text'], font_size)
    result = decrement(text)
    if not result[0]:
        return Exception('Unknown error in daily luck')
    textVertical = []
    for i in range(0, result[0]):
        font_height = len(result[i + 1]) * (font_size + 4)
        textVertical = vertical(result[i + 1])
        x = int(image_font_center[0] + (result[0] - 2) * font_size / 2 +
                (result[0] - 1) * 4 - i * (font_size + 4))
        y = int(image_font_center[1] - font_height / 2)
        draw.text((x, y), textVertical, fill=color, font=ttfront)

    img = pic2b64(img)
    img = MessageSegment.image(img)
    return img
Ejemplo n.º 29
0
async def bang_gacha(bot, ev):
    
    uid = ev['user_id']
    poolid = str(ev.message)
    
    if poolid in pool_dict:
        poolinfo = pool_dict[poolid]
        name = poolinfo[1]
        banner = pic2b64(Image.open(os.path.join(picpath,"pool",f"{poolid}.png")))
        banner = MessageSegment.image(banner)
        
        type = poolinfo[2]
        if type=="恒久的":
            type="普通"
        if type=="ドリームフェスティバル":
            type="Fes"
        
        start = poolinfo[3]
        end = poolinfo[4]
        uplist = poolinfo[5:]
        while "" in uplist:
            uplist.remove("")

        step = 3 if len(uplist)>=3 else 2
        pics=[]
        for i in range(0, len(uplist), step):
            size=180
            j = min(len(uplist), i + step)
            des = Image.new('RGBA', (step*size, size), (255, 255, 255, 255))
            for k, card in enumerate(uplist[i:j]):
                src = Image.open(os.path.join(picpath,"card",f"{card}_0.png"))
                des.paste(src, (k * size, 0))
            pics.append(des)
        res = concat_pic(pics)
        up=MessageSegment.image(pic2b64(res))

        msg=f"卡池[{name}]\n{banner}\n{type}池,开始于{start},结束于{end}\nPickUp列表:{up}"
        await bot.finish(ev, msg)
    else:
        await bot.finish(ev, '没有对应的卡池哦')
Ejemplo n.º 30
0
async def perfect_match(bot, ev: CQEvent):
    if gm.is_playing(ev.group_id):
        await bot.finish(ev, "游戏仍在进行中…")
    with gm.start_game(ev.group_id) as game:
        chosen_ids = random.sample(game_util.VALID_IDS, TOTAL_PIC_NUM)
        pushed_index = set()
        # 发送若干轮的隐藏部分子图的合成图,保证所有子图至少都被发送一次。发送完毕后等待若干秒再撤回图片
        for i in range(TURN_NUM):
            await bot.send(ev, f'记忆阶段{i+1}/{TURN_NUM}: ({BASIC_SHOW_TIME - i * 2}s后我会撤回图片哦~)')
            if i < TURN_NUM-1:
                shown_index = random.sample(range(TOTAL_PIC_NUM), TOTAL_PIC_NUM - HIDDEN_NUM)
                ids = [chosen_ids[i] if i in shown_index else game_util.UNKNOWN_ID for i in range(TOTAL_PIC_NUM)]
                pushed_index = pushed_index.union(set(shown_index))
            else:
                remnant_index = set(range(TOTAL_PIC_NUM)) - pushed_index
                shown_index = list(remnant_index)
                shown_index.extend(random.sample(pushed_index, TOTAL_PIC_NUM - HIDDEN_NUM - len(remnant_index)))
                ids = [chosen_ids[i] if i in shown_index else game_util.UNKNOWN_ID for i in range(TOTAL_PIC_NUM)]
            pic = MessageSegment.image(util.pic2b64(game_util.generate_full_pic(ROW_NUM, COL_NUM, ids)))
            msg = await bot.send(ev, pic)
            await asyncio.sleep(BASIC_SHOW_TIME - i * 2)
            await bot.delete_msg(message_id=msg['message_id'])
            await asyncio.sleep(3)
        # 开始答题
        correct_index = random.randint(0, TOTAL_PIC_NUM - 1)
        correct_id = chosen_ids[correct_index]
        game.answer = correct_index + 1
        correct_pic_img = MessageSegment.image(util.pic2b64(game_util.get_sub_pic_from_id(correct_id)))
        answer_number_img = MessageSegment.image(f'file:///{os.path.abspath(game_util.BACKGROUND_PIC_PATH)}')
        await bot.send(ev, f'还记得"{game_util.EXPLANATION[correct_id]}"的位置吗?{correct_pic_img}请告诉我它的编号~ ({ANSWER_TIME}s后公布答案){answer_number_img}')
        await asyncio.sleep(ANSWER_TIME)
        # 结算
        game.update_score()
        msg_part1 = f'{MessageSegment.at(game.winner[0])}首先答对,真厉害~ 加2分! 当前总分为{game.get_first_winner_score()}分' if game.winner else ''
        msg_part2 = f'{game_util.generate_at_message_segment(game.winner[1:])}也答对了, 加1分~' if game.winner[1:] else ''
        msg_part3 = f'{game_util.generate_at_message_segment(game.loser)}答错了, 扣1分o(╥﹏╥)o' if game.loser else ''
        msg_part4 = '咦, 这轮游戏没人参与, 看来题目可能有点难...' if not (msg_part1 or msg_part2 or msg_part3) else ""
        msg_part = '\n'.join([s for s in [msg_part1, msg_part2, msg_part3, msg_part4] if s])
        await bot.send(ev, f'正确答案是: {game.answer}{MessageSegment.image(util.pic2b64(game_util.generate_full_pic(ROW_NUM, COL_NUM, chosen_ids)))}{msg_part}')