Skip to content

Commit

Permalink
Merge branch 'develop'
Browse files Browse the repository at this point in the history
  • Loading branch information
KT-Yeh committed Sep 4, 2023
2 parents d38568f + 1f5211c commit df2cf32
Show file tree
Hide file tree
Showing 12 changed files with 548 additions and 357 deletions.
688 changes: 358 additions & 330 deletions Pipfile.lock

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion cogs/cookie_setting/cog.py
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ async def slash_cookie(self, interaction: discord.Interaction, option: int):
"**3.** 如下圖,在網址列輸入 `java`,然後貼上程式碼\n"
"**4.** 按 Enter,網頁會變成顯示你的 Cookie,全選然後複製\n"
f"**5.** 在這裡使用指令 {get_app_command_mention('cookie設定')} 提交已取得的Cookie\n"
". 遇到問題嗎?點 [教學連結](https://bit.ly/3LgQkg0) 查看其他方法\n",
". 遇到登入問題嗎?點 [教學連結](https://hackmd.io/66fq-6NsT1Kqxqbpkj1xTA) 查看解決方法\n",
title="原神小幫手 | 取得Cookie說明",
)
embed.set_image(url="https://i.imgur.com/OQ8arx0.gif")
Expand Down
48 changes: 43 additions & 5 deletions cogs/cookie_setting/ui.py
Original file line number Diff line number Diff line change
Expand Up @@ -34,11 +34,29 @@ class CookieModal(discord.ui.Modal, title="提交Cookie"):
label="Cookie",
placeholder='請貼上從網頁上取得的Cookie,取得方式請使用指令 "/cookie設定 顯示說明如何取得Cookie"',
style=discord.TextStyle.long,
required=True,
required=False,
min_length=50,
max_length=2000,
)

ltuid_v2: discord.ui.TextInput[discord.ui.Modal] = discord.ui.TextInput(
label="ltuid_v2",
placeholder="請貼上取得的 ltuid_v2",
style=discord.TextStyle.short,
required=False,
min_length=5,
max_length=20,
)

ltoken_v2: discord.ui.TextInput[discord.ui.Modal] = discord.ui.TextInput(
label="ltoken_v2",
placeholder="請貼上取得的 ltoken_v2",
style=discord.TextStyle.short,
required=False,
min_length=30,
max_length=150,
)

def __init__(self, games: list[genshin.Game]):
self.games: list[genshin.Game] = games
super().__init__()
Expand All @@ -47,16 +65,36 @@ async def on_submit(self, interaction: discord.Interaction):
await interaction.response.send_message(
embed=EmbedTemplate.normal("設定中,請稍後..."), ephemeral=True
)

# 將 ltuid_v2 和 ltoken_v2 附加到 cookie 中
v2_str = ""
cookie = self.cookie.value
if len(self.ltoken_v2.value) > 0:
# 檢測 cookie 是否為 v2 版本
if self.ltoken_v2.value.startswith("v2"):
v2_str = "_v2"
cookie += f" ltoken{v2_str}={self.ltoken_v2.value};"
if len(self.ltuid_v2.value) > 0:
if self.ltuid_v2.value.isdigit() is True:
cookie += f" ltuid{v2_str}={self.ltuid_v2.value};"
else: # ltuid_v2 不是數字,可能是 ltmid_v2
cookie += f" ltmid_v2={self.ltuid_v2.value};"

LOG.Info(f"設定 {LOG.User(interaction.user)} 的Cookie:{self.cookie.value}")
try:
cookie = await self._trim_cookies(self.cookie.value)
if cookie is None:
trimmed_cookie = await self._trim_cookies(cookie)
if trimmed_cookie is None:
raise Exception(
f"錯誤或無效的Cookie,請重新輸入(使用 {get_app_command_mention('cookie設定')} 顯示說明)"
)
msg = await genshin_py.set_cookie(interaction.user.id, cookie, self.games)
msg = await genshin_py.set_cookie(interaction.user.id, trimmed_cookie, self.games)
except Exception as e:
await interaction.edit_original_response(embed=EmbedTemplate.error(e))
embed = EmbedTemplate.error(e)
if embed.description is not None:
embed.description += (
"點 [>>教學連結<<](https://hackmd.io/66fq-6NsT1Kqxqbpkj1xTA) 查看解決方法\n"
)
await interaction.edit_original_response(embed=embed)
else:
await interaction.edit_original_response(embed=EmbedTemplate.normal(msg))

Expand Down
3 changes: 3 additions & 0 deletions cogs/daily_checkin/cog.py
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,9 @@ async def slash_daily(
}

_user = user or interaction.user
if _user.id == self.bot.application_id:
_user = interaction.user

defer, result = await asyncio.gather(
interaction.response.defer(ephemeral=(is_geetest == "是")),
genshin_py.claim_daily_reward(_user.id, **choice),
Expand Down
66 changes: 61 additions & 5 deletions cogs/schedule/ui.py
Original file line number Diff line number Diff line change
Expand Up @@ -106,18 +106,18 @@ def _str_to_int(self, value: str) -> int | None:
return int(value) if len(value) > 0 else None

@overload
def _to_msg(self, title: str, value: int | None) -> str:
def _to_msg(self, title: str, value: int | None, date_frequency: str = "每天") -> str:
...

@overload
def _to_msg(self, title: str, value: datetime | None) -> str:
def _to_msg(self, title: str, value: datetime | None, date_frequency: str = "每天") -> str:
...

def _to_msg(self, title: str, value: int | datetime | None) -> str:
def _to_msg(self, title: str, value: int | datetime | None, date_frequency: str = "每天") -> str:
if value is None:
return ""
if isinstance(value, datetime):
return f". {title}每天 {value.strftime('%H:%M')} 檢查\n"
return f". {title}{date_frequency} {value.strftime('%H:%M')} 檢查\n"
if value == 0:
return f". {title}:當完成時提醒\n"
else:
Expand Down Expand Up @@ -263,6 +263,20 @@ class StarrailCheckNotesThresholdModal(BaseNotesThresholdModal, title="設定星
max_length=4,
min_length=4,
)
universe: discord.ui.TextInput[discord.ui.Modal] = discord.ui.TextInput(
label="模擬宇宙:設定每周日幾點提醒本周的模擬宇宙還未完成 (不填表示不提醒)",
placeholder="請輸入一個介於 0000~2359 的數,例如 0200、2135",
required=False,
max_length=4,
min_length=4,
)
echoofwar: discord.ui.TextInput[discord.ui.Modal] = discord.ui.TextInput(
label="歷戰餘響:設定每周日幾點提醒本周的歷戰餘響還未完成 (不填表示不提醒)",
placeholder="請輸入一個介於 0000~2359 的數,例如 0200、2135",
required=False,
max_length=4,
min_length=4,
)

def __init__(self, user_setting: StarrailScheduleNotes | None = None):
"""設定表單預設值;若使用者在資料庫已有設定值,則帶入表單預設值"""
Expand All @@ -278,21 +292,40 @@ def __init__(self, user_setting: StarrailScheduleNotes | None = None):
if user_setting.check_daily_training_time
else None
)
self.universe.default = (
user_setting.check_universe_time.strftime("%H%M")
if user_setting.check_universe_time
else None
)
self.echoofwar.default = (
user_setting.check_echoofwar_time.strftime("%H%M")
if user_setting.check_echoofwar_time
else None
)
super().__init__()

async def on_submit(self, interaction: discord.Interaction) -> None:
try:
power = self._str_to_int(self.power.value)
expedition = self._str_to_int(self.expedition.value)
dailytraining = self._str_to_int(self.dailytraining.value)
universe = self._str_to_int(self.universe.value)
echoofwar = self._str_to_int(self.echoofwar.value)

# 檢查數字範圍
if power is None and expedition is None and dailytraining is None:
if (
power is None
and expedition is None
and dailytraining is None
and universe is None
and echoofwar is None
):
raise ValueError()
if (isinstance(power, int) and not (0 <= power <= 8)) or (
isinstance(expedition, int) and not (0 <= expedition <= 5)
):
raise ValueError()

dailytraining_time: datetime | None = None
if isinstance(dailytraining, int):
_time = time(dailytraining // 100, dailytraining % 100)
Expand All @@ -301,6 +334,25 @@ async def on_submit(self, interaction: discord.Interaction) -> None:
# 當今天已經超過設定的時間,則將檢查時間設為明日
if dailytraining_time < datetime.now():
dailytraining_time += timedelta(days=1)

universe_time: datetime | None = None
echoofwar_time: datetime | None = None
if isinstance(universe, int) or isinstance(echoofwar, int):
# 取得本周日的日期
_date = date.today() + timedelta(days=6 - date.today().weekday())
if isinstance(universe, int):
universe_time = datetime.combine(_date, time(universe // 100, universe % 100))
# 當今天已經超過設定的時間,則將檢查時間設為下周日
if universe_time < datetime.now():
universe_time += timedelta(days=7)
if isinstance(echoofwar, int):
echoofwar_time = datetime.combine(
_date, time(echoofwar // 100, echoofwar % 100)
)
# 當今天已經超過設定的時間,則將檢查時間設為下周日
if echoofwar_time < datetime.now():
echoofwar_time += timedelta(days=7)

except Exception:
await interaction.response.send_message(
embed=EmbedTemplate.error("輸入數值有誤,請確認輸入的數值為整數且在規定範圍內"),
Expand All @@ -315,6 +367,8 @@ async def on_submit(self, interaction: discord.Interaction) -> None:
threshold_power=power,
threshold_expedition=expedition,
check_daily_training_time=dailytraining_time,
check_universe_time=universe_time,
check_echoofwar_time=echoofwar_time,
)
)
await interaction.response.send_message(
Expand All @@ -323,5 +377,7 @@ async def on_submit(self, interaction: discord.Interaction) -> None:
f"{self._to_msg('開拓力 ', power)}"
f"{self._to_msg('委託執行', expedition)}"
f"{self._to_msg('每日實訓', dailytraining_time)}"
f"{self._to_msg('模擬宇宙', universe_time, '周日')}"
f"{self._to_msg('歷戰餘響', echoofwar_time, '周日')}"
)
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
"""增加星鐵即時便箋檢查項目: 模擬宇宙、歷戰餘響
Revision ID: ff5dbf6e00bb
Revises: ab959d5054b5
Create Date: 2023-09-02 11:02:56.565028
"""
import sqlalchemy as sa
from alembic import op

# revision identifiers, used by Alembic.
revision = "ff5dbf6e00bb"
down_revision = "ab959d5054b5"
branch_labels = None
depends_on = None


def upgrade() -> None:
# ### commands auto generated by Alembic - please adjust! ###
op.add_column(
"starrail_schedule_notes", sa.Column("check_universe_time", sa.DateTime(), nullable=True)
)
op.add_column(
"starrail_schedule_notes", sa.Column("check_echoofwar_time", sa.DateTime(), nullable=True)
)

# ### end Alembic commands ###


def downgrade() -> None:
# ### commands auto generated by Alembic - please adjust! ###
with op.batch_alter_table("starrail_schedule_notes", schema=None) as batch_op:
batch_op.drop_column("check_echoofwar_time")
batch_op.drop_column("check_universe_time")

# ### end Alembic commands ###
4 changes: 4 additions & 0 deletions database/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -232,6 +232,10 @@ class StarrailScheduleNotes(Base):
"""全部委託完成之前幾小時發送提醒"""
check_daily_training_time: Mapped[datetime.datetime | None] = mapped_column(default=None)
"""下次檢查今天的每日實訓還未完成的時間"""
check_universe_time: Mapped[datetime.datetime | None] = mapped_column(default=None)
"""下次檢查本周的模擬宇宙還未完成的時間"""
check_echoofwar_time: Mapped[datetime.datetime | None] = mapped_column(default=None)
"""下次檢查本周的歷戰餘響還未完成的時間"""


class StarrailShowcase(Base):
Expand Down
2 changes: 1 addition & 1 deletion genshin_db/models/characters.py
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,7 @@ class Character(GenshinDbBase):
character_voice: CharacterVoice = Field(alias="cv")
ascend_costs: AscendCosts = Field(alias="costs")
"""突破所需素材"""
images: Images
images: Optional[Images] = None
version: str
"""新增至遊戲當時的版本號碼"""

Expand Down
7 changes: 4 additions & 3 deletions genshin_db/parsers.py
Original file line number Diff line number Diff line change
Expand Up @@ -161,9 +161,10 @@ def parse_character(cls, character: Character) -> discord.Embed:
embed = EmbedTemplate.normal(
character.description, title=f"★{character.rarity} {character.name}"
)
embed.set_thumbnail(url=character.images.icon_url)
if character.images.cover1_url is not None:
embed.set_image(url=character.images.cover1_url)
if character.images is not None:
embed.set_thumbnail(url=character.images.icon_url)
if character.images.cover1_url is not None:
embed.set_image(url=character.images.cover1_url)

embed.add_field(
name="屬性",
Expand Down
18 changes: 18 additions & 0 deletions genshin_py/auto_task/realtime_notes/starrail.py
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,24 @@ async def check_threshold(user: StarrailScheduleNotes, notes: genshin.models.Sta
# 下次檢查時間為今天+1天,並更新至資料庫
user.check_daily_training_time += timedelta(days=1)
next_check_time.append(user.check_daily_training_time)
# 檢查模擬宇宙
if isinstance(user.check_universe_time, datetime):
# 當現在時間已超過設定的檢查時間
if datetime.now() >= user.check_universe_time:
if notes.current_rogue_score < notes.max_rogue_score:
msg += "本周的模擬宇宙還未完成!"
# 下次檢查時間為下一周,並更新至資料庫
user.check_universe_time += timedelta(weeks=1)
next_check_time.append(user.check_universe_time)
# 檢查歷戰餘響
if isinstance(user.check_echoofwar_time, datetime):
# 當現在時間已超過設定的檢查時間
if datetime.now() >= user.check_echoofwar_time:
if notes.remaining_weekly_discounts > 0:
msg += "本周的歷戰餘響還未完成!"
# 下次檢查時間為下一周,並更新至資料庫
user.check_echoofwar_time += timedelta(weeks=1)
next_check_time.append(user.check_echoofwar_time)

# 設定下次檢查時間,從上面設定的時間中取最小的值
check_time = min(next_check_time)
Expand Down

0 comments on commit df2cf32

Please sign in to comment.