このBOTは原神のビルド画像の生成などを行うことのできるBOTです
利用方法などは公式ページや/genbot help
コマンド参考にしてください
Enkaという原神のビルドカードなどが作れるサービスの中で提供されているAPIの機能を利用させてもらっています。
このBOTではDockerを利用して環境構築しており以下のような構成で実行されています。
- Dockerリポジトリ
- データベース (Postgres)
- 原神ステータスBOTリポジトリ
- lib ディレクトリ
Pycordを用いたGenshinStatusProjectのDiscord版Botサーバー
このBOTは原神のビルド画像の生成などを行うことのできるBOTです
利用方法などは公式ページや/genbot help
コマンド参考にしてください
Enkaという原神のビルドカードなどが作れるサービスの中で提供されているAPIの機能を利用させてもらっています。
このBOTではDockerを利用して環境構築しており以下のような構成で実行されています。
urlのデータを持っているデータを参照させるためurlがあるかの判定を先頭に書くだけで解決する
if "url" in characterName[name]:
return characterName[name]["url"]
この関数の呼び出し先でURLにNoneが含まれるかどうかの判定している部分が問題のためValueErrorなどの例外をraiseする方法に変えたほうが良いと思います
また例外で条件分岐する処理は可読性を下げるので結果的に以下のようなソースで処理するのが好ましいと考えます(利用先ではValueErrorを受け取ったときの処理を記述します
def genshingen(name):
if name in characterName:
if "url" in characterName[name]:
return characterName[name]["url"]
if "zh" in characterName[name]:
result = characterName[name]["zh"]
else:
raise ValueError()
elif name in characterTrans:
resalt = characterName[characterTrans[name]["ja"]]["zh"]
else:
raise ValueError()
result = urllib.parse.quote(result)
return f"https://bbs.hoyolab.com/hoyowiki/picture/character/{resalt}/avatar.png"
class DayOfWeekUnexploredRegion:
def __init__(self, file_path: str):
self.EMBEDS: dict[int, discord.Embed] = {}
self.SELECT_OPTIONS: list[discord.SelectOption] = []
data: dict = yaml(file_path).load_yaml()
for k, v in data.items():
self.__add_data(
key=k, day_of_week=v["day_of_week"], url=v["url"])
def __add_data(self, key, day_of_week, url):
# embedの追加
embed = discord.Embed(
title=f"{day_of_week}の日替わり秘境はこちら", color=0x1e90ff)
embed.set_image(url=url)
self.EMBEDS[key] = embed
# optionsの追加
self.SELECT_OPTIONS.append(
discord.SelectOption(label=day_of_week, value=str(key)))
DATA = DayOfWeekUnexploredRegion("weekday.yaml")
class weekselectView(View):
def __init__(self):
self.weekday = datetime.date.today().weekday()
# タイムアウトを5分に設定してタイムアウトした時にすべてのボタンを無効にする
super().__init__(timeout=300, disable_on_timeout=True)
@discord.ui.button(label="今日の秘境に戻る")
async def today(self, _: discord.ui.Button, interaction: discord.Interaction):
self.weekday = datetime.date.today().weekday()
await interaction.response.edit_message(embed=DATA.EMBEDS[self.weekday], view=self)
@discord.ui.button(label="次の日の秘境")
async def nextday(self, _: discord.ui.Button, interaction: discord.Interaction):
self.weekday = (self.weekday + 1) % 7
await interaction.response.edit_message(embed=DATA.EMBEDS[self.weekday], view=self)
@discord.ui.select(
placeholder="確認したい曜日を選択",
options=DATA.SELECT_OPTIONS
)
async def select_callback(self, select: discord.ui.Select, interaction: discord.Interaction):
self.weekday = int(select.values[0])
view = self
print(
f"実行者:{interaction.user.name}\n鯖名:{interaction.guild.name}\n日替わり - {self.weekday}")
await interaction.response.edit_message(embed=DATA.EMBEDS[self.weekday], view=view)
viewオブジェクトが持っているweekday変数はint型のままの方が使い勝手が良さそうでした
これに伴いyamlの元データのkeyもint型にしなきゃいけないです
また最新のpycord2.1.3ではView
にdisable_on_timeout
のパラメータが追加されてTrue
にすることにより、自動でボタンなどを無効化してくれるようになったので実装すると親切かと思います
ストレージに保存しなくても fileioのオブジェクトに保存することでメモリのみで完結するので修正すると良いです
from io import BytesIO
fileio = BytesIO()
image.save(fileio, format="png")
fileio.seek(0)
return File(fp=fileio, filename="image.png")
getParはガチャ1回あたりの確率を取得するため、10連で行っている確率と乖離していると考えられる
よって修正が必要です。
更新時間が3時間間隔になっているため、おそらく更新時間前後では表示がおかしくなる可能性が高いです。
以下のように定時刻での更新をすることを推奨します(マージンを取って1秒遅らせています。)
tz = datetime.timezone(offset=datetime.timedelta(hours=9))
@tasks.loop(time=[datetime.time(hour=5, second=1, tzinfo=tz), datetime.time(hour=1, second=1, tzinfo=tz)])
async def slow_count(self):
getTime.init_reference_times()
print(f'=============日付を更新したんご=============\n{datetime.datetime.now().strftime("%Y年%m月%d日 %H:%M:%S")}')
現在のガチャコマンドを最適化等を行うためにタスクをまとめます
現状のwishコマンドと仕様を合わせる場合、確率が正しく計算できない気がします。
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.