mirror of
https://github.com/zhenxun-org/zhenxun_bot.git
synced 2025-12-15 06:12:53 +08:00
124 lines
4.0 KiB
Python
124 lines
4.0 KiB
Python
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"]
|