Giter Club home page Giter Club logo

genshin-discordbot's Introduction

原神のステータスBOT

概要

このBOTは原神のビルド画像の生成などを行うことのできるBOTです
利用方法などは公式ページ/genbot helpコマンド参考にしてください

開発者向け

利用しているAPI

Enkaという原神のビルドカードなどが作れるサービスの中で提供されているAPIの機能を利用させてもらっています。

構成

このBOTではDockerを利用して環境構築しており以下のような構成で実行されています。

genshin-discordbot's People

Contributors

cinnamonsea2073 avatar nikawamikan avatar

Stargazers

BENI-Rebbit avatar  avatar  avatar

Watchers

 avatar

genshin-discordbot's Issues

ティナリ等の画像がでない問題についての修正

以下のソースでURLの取得優先度が低いことが原因

https://github.com/CinnamonSea2073/Genshin-Discordbot/blob/b46215db8473312b7a4b9840347a84a448a91661/cogs/wish.py#L28-L40

暫定的な解決策

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"

defer()を利用した返答方法の検討

image
このあたりの返答に時間がかかる処理にはctx.respond.defer()を利用してローディングしてるようにするといいかもしれないので確認
実装してみて良さげだったらプルリク送る

秘境表示の内部的な処理に関するリファクタ

https://github.com/CinnamonSea2073/Genshin-Discordbot/blob/795550f34220cf9efc7826dcb153c72093a85493/cogs/genbot.py#L57-L106

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ではViewdisable_on_timeoutのパラメータが追加されてTrueにすることにより、自動でボタンなどを無効化してくれるようになったので実装すると親切かと思います

聖遺物に特化した生成モデルを作りたい

image

特にこんな感じでステータス表示したら面白いんでなかろうか(やりたいだけ)
ただPillowでグラフ描画機能がないので、作るならアルゴリズム自作しなければいけない
(グラフ描画ライブラリはあるけど、扱いづらそう?)

tasks.loopの設定に問題があります

更新時間が3時間間隔になっているため、おそらく更新時間前後では表示がおかしくなる可能性が高いです。

https://github.com/CinnamonSea2073/Genshin-Discordbot/blob/0ff935aeb2723c4d6943faa2f5befaf487d2b810/cogs/genbot.py#L252-L255

以下のように定時刻での更新をすることを推奨します(マージンを取って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コマンドの実装のToDo

とりあえずの方針

現在のガチャコマンドを最適化等を行うためにタスクをまとめます

  • データのDB化
    • ユーザーデータ
    • 基準となるデータ(これについてはjsonやyamlでも問題はない)
  • ガチャ確率の計算に関するアルゴリズムの修正
    1回ごとの確率を計算する確率取得関数があるため、それを利用します。

認識について

現状のwishコマンドと仕様を合わせる場合、確率が正しく計算できない気がします。

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.