diff --git a/plugins/genshin/almanac/__init__.py b/plugins/genshin/almanac/__init__.py new file mode 100644 index 00000000..36122e09 --- /dev/null +++ b/plugins/genshin/almanac/__init__.py @@ -0,0 +1,49 @@ +from .alc import get_almanac_base64_str, load_data +import os +from util.utils import get_bot, scheduler +from nonebot import on_command +from models.level_user import LevelUser +from nonebot.typing import T_State +from nonebot.adapters.cqhttp import Bot, GroupMessageEvent +from util.init_result import image +from services.log import logger +from models.group_remind import GroupRemind + +FILE_PATH = os.path.dirname(__file__) + +almanac = on_command('原神黄历', priority=5, block=True) +reload = on_command('重载原神黄历数据', priority=5, block=True) + + +@almanac.handle() +async def _(bot: Bot, event: GroupMessageEvent, state: T_State): + almanac_base64 = get_almanac_base64_str() + mes = image(b64=almanac_base64) + "\n ※ 黄历数据来源于 genshin.pub" + await almanac.send(mes) + logger.info( + f"(USER {event.user_id}, GROUP {event.group_id if event.message_type != 'private' else 'private'})" + f" 发送查看原神黄历") + + +@reload.handle() +async def _(bot: Bot, event: GroupMessageEvent, state: T_State): + if await LevelUser.check_level(event.user_id, event.group_id, 5): + load_data() + await reload.send("重载成功") + + +@scheduler.scheduled_job( + 'cron', + hour=10, + minute=25, +) +async def _(): + # 每日提醒 + bot = get_bot() + gl = await bot.get_group_list(self_id=bot.self_id) + gl = [g['group_id'] for g in gl] + almanac_base64 = get_almanac_base64_str() + mes = image(b64=almanac_base64) + "\n ※ 黄历数据来源于 genshin.pub" + for gid in gl: + if await GroupRemind.get_status(gid, 'almanac'): + await bot.send_group_msg(group_id=int(gid), message=mes) diff --git a/plugins/genshin/almanac/alc.py b/plugins/genshin/almanac/alc.py new file mode 100644 index 00000000..94c656b2 --- /dev/null +++ b/plugins/genshin/almanac/alc.py @@ -0,0 +1,123 @@ +from PIL import Image, ImageDraw, ImageFont +from io import BytesIO + +import os +import json +import random +import base64 +import time + +FILE_PATH = os.path.dirname(__file__) +FONT_PATH = os.path.join(FILE_PATH, "汉仪文黑.ttf") + +data = {} # configs.json里的数据 + +almanac_data = { + # 生成的黄历base64字符串和黄历更新日期 + "date": "", + "almanac_base64_str": "" +} + +chinese = {"0": "", "1": "一", "2": "二", "3": "三", "4": "四", "5": "五", "6": "六", "7": "七", "8": "八", "9": "九"} + + +def month_to_chinese(month: str): + # 把日期数字转成中文数字 + m = int(month) + if m < 10: + return chinese[month[-1]] + elif m < 20: + return "十" + chinese[month[-1]] + else: + return chinese[month[0]] + "十" + chinese[month[-1]] + + +def load_data(): + # 载入config.json文件的数据 + global data + with open(os.path.join(FILE_PATH, 'config.json'), 'r', encoding='UTF-8') as f: + data = json.load(f) + + almanac_data["date"] = "" + almanac_data["almanac_base64_str"] = "" + + +load_data() + + +def seed_random_list(seed: str, l: list): + # 使用随机种子随机选择列表中的元素,相同的种子和列表将返回同样的输出 + seed = seed + str(l) + random.seed(seed) + index = random.random() * len(l) + return l[int(index)] + + +def generate_almanac(): + # 生成黄历图片,然后转换成base64保存到 almanac_data["almanac_base64_str"] + + seed = time.strftime("%Y-%m-%d") + offset = 1 + today_luck = [] + l = list(data.keys()) + + while len(today_luck) < 6: + # 随机6个不同的运势放到 today_luck + r = seed_random_list(str(offset) + seed, l) + if r in today_luck: + offset += 1 + else: + today_luck.append(r) + + back = Image.open(os.path.join(FILE_PATH, "back.png")) + + year = time.strftime("%Y") + month = month_to_chinese(time.strftime("%m")) + "月" + day = month_to_chinese(time.strftime("%d")) + "日" + + draw = ImageDraw.Draw(back) + draw.text((118, 165), year, fill="#8d7650ff", font=ImageFont.truetype(FONT_PATH, size=30), anchor="mm", + align="center") + draw.text((260, 165), day, fill="#f7f8f2ff", font=ImageFont.truetype(FONT_PATH, size=35), anchor="mm", + align="center") + draw.text((410, 165), month, fill="#8d7650ff", font=ImageFont.truetype(FONT_PATH, size=30), anchor="mm", + align="center") + + buff = Image.new("RGBA", (325, 160)) + debuff = Image.new("RGBA", (325, 160)) + + buff_draw = ImageDraw.Draw(buff) + debuff_draw = ImageDraw.Draw(debuff) + + for i in range(3): + buff_name = today_luck[i] + debuff_name = today_luck[(i + 3)] + + buff_effect = seed_random_list(seed, data[buff_name]["buff"]) + debuff_effect = seed_random_list(seed, data[debuff_name]["debuff"]) + + buff_draw.text((0, i * 53), buff_name, fill="#756141ff", font=ImageFont.truetype(FONT_PATH, size=25)) + debuff_draw.text((0, i * 53), debuff_name, fill="#756141ff", font=ImageFont.truetype(FONT_PATH, size=25)) + + buff_draw.text((0, i * 53 + 28), buff_effect, fill="#b5b3acff", font=ImageFont.truetype(FONT_PATH, size=19)) + debuff_draw.text((0, i * 53 + 28), debuff_effect, fill="#b5b3acff", font=ImageFont.truetype(FONT_PATH, size=19)) + + back.paste(buff, (150, 230), buff) + back.paste(debuff, (150, 400), debuff) + + bio = BytesIO() + back.save(bio, format='PNG') + base64_str = base64.b64encode(bio.getvalue()).decode() + + almanac_data["date"] = time.strftime("%Y-%m-%d") + almanac_data["almanac_base64_str"] = 'base64://' + base64_str + + +def get_almanac_base64_str(): + # if almanac_data["date"] == time.strftime("%Y-%m-%d"): + # return almanac_data["almanac_base64_str"] + # else: + # generate_almanac() + # return almanac_data["almanac_base64_str"] + generate_almanac() + return almanac_data["almanac_base64_str"] diff --git a/plugins/genshin/almanac/back.png b/plugins/genshin/almanac/back.png new file mode 100644 index 00000000..bce9428b Binary files /dev/null and b/plugins/genshin/almanac/back.png differ diff --git a/plugins/genshin/almanac/config.json b/plugins/genshin/almanac/config.json new file mode 100644 index 00000000..ebd1e35b --- /dev/null +++ b/plugins/genshin/almanac/config.json @@ -0,0 +1,70 @@ +{ + "抽卡":{ + "buff": ["欧气满满,十连出金","出金不歪"], + "debuff": ["武器大师","保底出金","金色会是痛苦大剑"] + }, + "刷世界boss":{ + "buff": ["双攻双爆角斗士"], + "debuff": ["只有保底材料","贪生怕死角斗士"] + }, + "刷风本":{ + "buff": ["会有极品猎人套","会掉真正的少女心","治疗加成少女头"], + "debuff": ["勇往直前少女心","少女飘摇的杀意","少女暴怒的容颜"] + }, + "刷火本":{ + "buff": ["魔女帽子火伤杯","暴伤魔女帽!","火伤魔女心!"], + "debuff": ["幡 然 醒 悟","这么阴间的地方真的会有魔女套吗?","不务正业火魔女","会匹配到3个卢姥爷"] + }, + "刷岩本":{ + "buff": ["悠久的磐岩伴你左右","岩神的庇护常在"], + "debuff": ["防御流星杯,你值得拥有"] + }, + "刷宗室":{ + "buff": ["物理伤害骑士道,元素精通宗室套"], + "debuff": ["贪生怕死骑士道,物理伤害宗室杯"] + }, + "刷冰本":{ + "buff": ["双暴词条概率up"], + "debuff": ["防御力船帽,无人可及"] + }, + "刷雷本":{ + "buff": ["愿雷鸟伴你左右"], + "debuff": ["来表演一个只掉平雷套的绝活","风神忽悠雷凶兆"] + }, + "锄大地":{ + "buff": ["会掉一大堆紫色材料"], + "debuff": ["深渊法师爱你哟","会被冰水法控到死"] + }, + "挖矿":{ + "buff": ["开矿出双材料"], + "debuff": ["去别人世界会被拒"] + }, + "刷天赋本":{ + "buff": ["金色!我看到了金色的书!"], + "debuff": ["2蓝2绿不会变"] + }, + "刷突破材料":{ + "buff": ["金色!我看到了金色的材料!"], + "debuff": ["2蓝2绿不会变"] + }, + "升级圣遗物":{ + "buff": ["稀有词条跳跳跳","会双爆拉满"], + "debuff": ["女 仆 狂 喜","无中生有防御力","生命拉满","完美避开双爆"] + }, + "打风魔龙":{ + "buff": ["看我一箭一个风魔鸡","今天特瓦林可以给想要的突破材料","5金加原胚!"], + "debuff": ["会不小心掉下平台","不小心被地板烫死了"] + }, + "打狼王":{ + "buff": ["今天安德琉斯的心情不错,可以py一下","5金加原胚!"], + "debuff": ["狼尾巴*1"] + }, + "打公子":{ + "buff": ["今天可以和公子py想要的突破材料","5金加原胚!"], + "debuff": ["要角没有!要命一条!"] + } +} + + + + diff --git a/plugins/genshin/almanac/汉仪文黑.ttf b/plugins/genshin/almanac/汉仪文黑.ttf new file mode 100644 index 00000000..891435dc Binary files /dev/null and b/plugins/genshin/almanac/汉仪文黑.ttf differ diff --git a/plugins/genshin/material_remind/__init__.py b/plugins/genshin/material_remind/__init__.py new file mode 100644 index 00000000..0abd8bd4 --- /dev/null +++ b/plugins/genshin/material_remind/__init__.py @@ -0,0 +1,72 @@ +from nonebot import on_command +from nonebot.typing import T_State +from nonebot.adapters.cqhttp import Bot, MessageEvent +from util.init_result import image + +import time + +material = on_command('今日素材', aliases={'今日材料', '今天素材', '今天材料'}, priority=5, block=True) +role_material = on_command('天赋材料', priority=5, block=True) + + +def get_today_material(name: str): + # 返回今天的材料图片CQ码 + if name == '天赋材料': + return image('天赋材料.png', "genshin/material/") + week = time.strftime("%w") + png_name = '' + if week == "0": + return "今天是周日,所有材料副本都开放了。" + elif week in ["1", "4"]: + png_name = f"{name}_周一周四.png" + elif week in ["2", "5"]: + png_name = f"{name}_周二周五.png" + elif week in ["3", "6"]: + png_name = f"{name}_周三周六.png" + + return image(png_name, "genshin/material/") + + +# @sv.on_fullmatch('开启原神每日素材提醒') +# async def open_remind(bot , ev): +# gid = str(ev.group_id) +# if not (gid in group_list): +# group_list.append(gid) +# save_group_list() +# await bot.send(ev, "每日提醒已开启,每天8点会发送今日素材") +# +# +# @sv.on_fullmatch('关闭原神每日素材提醒') +# async def off_remind(bot , ev): +# gid = str(ev.group_id) +# if gid in group_list: +# group_list.remove(gid) +# save_group_list() +# await bot.send(ev, "每日提醒已关闭") + +@material.handle() +async def _(bot: Bot, event: MessageEvent, state: T_State): + if time.strftime("%w") == "0": + await material.send("今天是周日,所有材料副本都开放了。") + return + arms_material_CQ = get_today_material("武器突破材料") + roles_material_CQ = get_today_material("角色天赋材料") + await material.send(arms_material_CQ + roles_material_CQ) + + +@role_material.handle() +async def _(bot: Bot, event: MessageEvent, state: T_State): + await material.send(get_today_material("天赋材料")) + +# @sv.scheduled_job('cron', hour='8') +# async def material_remind(): +# # 每日提醒 +# if time.strftime("%w") == "0": +# # 如果今天是周日就不发了 +# return +# bot = get_bot() +# arms_material_CQ = get_today_material("武器突破材料") +# roles_material_CQ = get_today_material("角色天赋材料") +# for gid in group_list: +# await bot.send_group_msg(group_id=int(gid), message=arms_material_CQ) +# await bot.send_group_msg(group_id=int(gid), message=roles_material_CQ) diff --git a/plugins/genshin/qiu_qiu_translation/__init__.py b/plugins/genshin/qiu_qiu_translation/__init__.py new file mode 100644 index 00000000..6f10114e --- /dev/null +++ b/plugins/genshin/qiu_qiu_translation/__init__.py @@ -0,0 +1,37 @@ +from .qiu_translation import qiu_qiu_word_translation, qiu_qiu_phrase_translation +from nonebot.adapters.cqhttp import Bot, MessageEvent +from nonebot.typing import T_State +from nonebot import on_command +from util.utils import get_message_text +from services.log import logger + + +qiuqiu = on_command("丘丘语翻译", aliases={"丘丘一下", "丘丘翻译"}, priority=5, block=True) + +suffix = "\n※ 只能从丘丘语翻译为中文,不能反向翻译\n" \ + "※ 注意空格,不要加入任何标点符号\n" \ + "※ 翻译数据来源于 米游社论坛" + + +@qiuqiu.handle() +async def _(bot: Bot, event: MessageEvent, state: T_State): + txt = get_message_text(event.json()).lower() + if txt == "": + return + mes = qiu_qiu_phrase_translation(txt) + if not mes: + mes = qiu_qiu_word_translation(txt) + mes += suffix + # print(mes) + await qiuqiu.send(mes, at_sender=True) + logger.info( + f"(USER {event.user_id}, GROUP {event.group_id if event.message_type != 'private' else 'private'})" + f" 发送丘丘翻译:" + txt) + + + + + + + + diff --git a/plugins/genshin/qiu_qiu_translation/qiu_qiu_dictionary.json b/plugins/genshin/qiu_qiu_translation/qiu_qiu_dictionary.json new file mode 100644 index 00000000..08d0f329 --- /dev/null +++ b/plugins/genshin/qiu_qiu_translation/qiu_qiu_dictionary.json @@ -0,0 +1,127 @@ +{ + "word": { + + "a": "啊", + + "beru": "做", + "biadam": "找死啊", + "biat": "暴揍", + "buka": "肚子", + + "celi": "元素", + + "dada": "厉害", + "dala": "什么", + "domu": "跳舞", + + "eleka": "此时此刻", + + "guru": "咕", + "gusha": "草", + + "ika": "敌人", + + "kundela": "活着", + "kuzi": "强大", + "kucha": "吃草", + + "la": "啦~", + "lata": "水元素", + + "mani": "给予", + "mi": "我", + "mimi": "我们", + "mita": "肉类", + "mosi": "吃", + "movo": "带来", + "muhe": "胜利", + + "ni": "风", + "nini": "风暴", + "nunu": "睡觉", + "nye": "不", + + "odomu": "朋友", + "olah": "你好", + + "plata": "盾牌", + "pupu": "噗噗", + + "sada": "唱歌", + "shato": "伴随", + "si": "什么", + + "tomo": "感激", + "todo": "放心", + "tiga": "矿石", + + "upa": "聚集", + "unu": "乌努", + + "valo": "谢谢你", + "vin": "酒", + + "ya": "人", + "yaya": "人们", + "ye": "家伙", + "yeye": "这些家伙", + "yo": "你", + "yoyo": "你们", + + "zido": "杀死" + + }, + "phrase": { + "beru si": "做什么", + "biadam": "可恶啊,找死啊,愤怒语气", + "biat": "打爆,暴揍;可恶的", + + "dada": " 极好的,厉害的", + "dala": "表示疑问,不明白的集合,翻译为哪个,什么", + + "guru-guru": "拟声词,形容肚子咕咕叫的声音,饥饿", + "guru guru": "拟声词,形容肚子咕咕叫的声音,饥饿", + "gusha": "植物类食物,不怎么好的,难过的", + + "kucha pupu": "拟声词,吃草时候的拟声词,咯吱噗噗,形容吃草吃得香,贬义", + + "mita": "肉类,好的,好东西,有时代丘丘人,丘丘人部落,好肉族", + "mosi mita": "吃肉,表示开心", + "mosi gusha": "吃草,表示难过", + "movo": "带来,搬运;可引申为收获,丰收", + "muhe": "胜利,战胜;成功的", + + "nini": "大量风元素,风暴,狂风", + "nye": "表示否定,没有了,不是", + + "pupu":"拟声词,噗噗,表示嘲讽", + + "sada": "唱歌,歌颂", + "shato": "乘着,伴随着", + + "upa": "凝聚,聚集,集合;聚落,部落", + "unu": "乌努,丘丘人所崇拜的神灵", + + "valo": "谢谢你,不客气/再见", + "vin": "酒的,喝酒有关的,酒桶盖子", + + "ya": "特指人类,一个人类", + "yaya": "人类的复数 ,大群人类", + "ye": "你这个家伙,蔑称;或用于地位高者对地位低者的称呼", + "yeye": "你们这些家伙,蔑称,ye的复数", + "yo": "你,友善称呼", + "yoyo": "你们,yo的复数,友善称呼ye", + + + + "nye mita da ye mosi zido": "再见,一路平安", + "vin plata dada": "你的酒桶盾牌真不错", + "kucha pupu gucha ye": "你咯吱噗噗的吃草的样子真的好搞笑", + "mani nini biaodomu": "愿风暴给予你死亡", + "celi dada mimi nunu": "赞美元素,我们睡觉吧", + "muhe ye": "你们是不可战胜的", + "ye dada": "你们可真棒", + "ye yika": "你们是敌人", + "nini zido": "愿风暴杀死你" + } +} \ No newline at end of file diff --git a/plugins/genshin/qiu_qiu_translation/qiu_translation.py b/plugins/genshin/qiu_qiu_translation/qiu_translation.py new file mode 100644 index 00000000..74442ffb --- /dev/null +++ b/plugins/genshin/qiu_qiu_translation/qiu_translation.py @@ -0,0 +1,71 @@ +import json +import os + +FILE_PATH = os.path.dirname(__file__) + +QIU_QIU_WORD = {} +QIU_QIU_PHRASE = {} + +with open(os.path.join(FILE_PATH, 'qiu_qiu_dictionary.json'), 'r', encoding='UTF-8') as f: + data = json.load(f) + QIU_QIU_WORD = data["word"] + QIU_QIU_PHRASE = data["phrase"] + + +def compare_words(word): + # 比对word库是否有匹配的单词,有的话返回翻译,没有返回原词 + if word in QIU_QIU_WORD: + return QIU_QIU_WORD[word] + + return word + + +def compare_phrase(phrase): + # 比对phrase库是否有匹配的单词,有的话返回翻译,没有的话匹配word库,都没有返回原词 + if phrase in QIU_QIU_PHRASE: + return QIU_QIU_PHRASE[phrase] + if phrase in QIU_QIU_WORD: + return QIU_QIU_WORD[phrase] + + return phrase + + +def qiu_qiu_word_translation(txt: str): + # 对语句按空格分隔替换单词翻译 + txt_list = txt.split(" ") + mes = "你查询的的丘丘语意思为:\n" + + for word in txt_list: + tra_word = compare_words(word) + + if tra_word == word: + # 如果是原词表示没有翻译,前后加空格接回语句里 + if not mes[-1] == " ": + mes += " " + mes += tra_word + mes += " " + else: + mes += tra_word + mes += "\n" + return mes + + +def qiu_qiu_phrase_translation(phrase): + # 语句翻译,先看phrase库是不是有匹配的语句 + # 没有的话把单词拆开返回单词的意思 + tra_phrase = compare_phrase(phrase) + if tra_phrase != phrase: + return f"\n翻译丘丘语意思为:\n【{tra_phrase}】\n" + + txt_list = phrase.split(" ") + mes = "没有查到这句丘丘语,以下是单词的翻译\n" + for word in txt_list: + if word == " ": + continue + tra_word = compare_phrase(word) + if tra_word == word: + mes += f"{word} : 没有这个词的翻译\n" + else: + mes += f"{word} : {tra_word}\n" + + return mes