feat: Add streak tracking and notifications for friends' match results
All checks were successful
continuous-integration/drone/push Build is passing
All checks were successful
continuous-integration/drone/push Build is passing
This commit is contained in:
parent
74239401e0
commit
52821fdbc1
@ -42,13 +42,26 @@ async def send_message(channel):
|
|||||||
|
|
||||||
try:
|
try:
|
||||||
matches = dota.get_friends_recent_matches()
|
matches = dota.get_friends_recent_matches()
|
||||||
except:
|
# 获取连胜连败消息
|
||||||
|
streak_notifications = dota.check_streaks()
|
||||||
|
except Exception as e:
|
||||||
|
logger.error(f"Error in send_message task: {e}")
|
||||||
return
|
return
|
||||||
|
|
||||||
for match_ in matches:
|
for match_ in matches:
|
||||||
data = await dota.serialize_match_for_discord(match_)
|
data = await dota.serialize_match_for_discord(match_)
|
||||||
logger.info(f"sending match {match_['match_id']}, {data}")
|
logger.info(f"sending match {match_['match_id']}, {data}")
|
||||||
try:
|
try:
|
||||||
|
# 发送比赛结果
|
||||||
await channel.send(content=data['content'], embeds=[discord.Embed.from_dict(embed) for embed in data['embeds']])
|
await channel.send(content=data['content'], embeds=[discord.Embed.from_dict(embed) for embed in data['embeds']])
|
||||||
|
|
||||||
|
# 如果有连胜连败消息,一并发送
|
||||||
|
if streak_notifications:
|
||||||
|
for notification in streak_notifications:
|
||||||
|
await channel.send(content=notification)
|
||||||
|
# 发送后清空通知列表,避免重复发送
|
||||||
|
streak_notifications = []
|
||||||
|
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
logger.error(f"send match error {e}")
|
logger.error(f"send match error {e}")
|
||||||
|
|
||||||
|
|||||||
77
dota.py
77
dota.py
@ -91,6 +91,9 @@ class Friend(BaseModel):
|
|||||||
name = peewee.CharField()
|
name = peewee.CharField()
|
||||||
active = peewee.BooleanField(default=True)
|
active = peewee.BooleanField(default=True)
|
||||||
rank_tier = peewee.IntegerField(null=True)
|
rank_tier = peewee.IntegerField(null=True)
|
||||||
|
win_streak = peewee.IntegerField(default=0) # 连胜计数
|
||||||
|
loss_streak = peewee.IntegerField(default=0) # 连败计数
|
||||||
|
last_match_id = peewee.IntegerField(null=True) # 上一场比赛ID,用于避免重复计算
|
||||||
|
|
||||||
def get_recent_matches(self, limit=1):
|
def get_recent_matches(self, limit=1):
|
||||||
try:
|
try:
|
||||||
@ -214,9 +217,45 @@ class Friend(BaseModel):
|
|||||||
|
|
||||||
return data
|
return data
|
||||||
|
|
||||||
|
def update_streak(self, match_id, win):
|
||||||
|
"""更新连胜连败计数"""
|
||||||
|
# 避免重复计算同一场比赛
|
||||||
|
if self.last_match_id == match_id:
|
||||||
|
return None
|
||||||
|
|
||||||
|
old_win_streak = self.win_streak
|
||||||
|
old_loss_streak = self.loss_streak
|
||||||
|
|
||||||
|
if win:
|
||||||
|
self.win_streak += 1
|
||||||
|
self.loss_streak = 0 # 重置连败
|
||||||
|
else:
|
||||||
|
self.loss_streak += 1
|
||||||
|
self.win_streak = 0 # 重置连胜
|
||||||
|
|
||||||
|
self.last_match_id = match_id
|
||||||
|
self.save()
|
||||||
|
|
||||||
|
# 返回连胜连败状态变化信息
|
||||||
|
result = {
|
||||||
|
'name': self.name,
|
||||||
|
'win': win,
|
||||||
|
'win_streak': self.win_streak,
|
||||||
|
'loss_streak': self.loss_streak,
|
||||||
|
'win_streak_broken': not win and old_win_streak >= 3,
|
||||||
|
'loss_streak_broken': win and old_loss_streak >= 3,
|
||||||
|
'old_win_streak': old_win_streak,
|
||||||
|
'old_loss_streak': old_loss_streak
|
||||||
|
}
|
||||||
|
|
||||||
|
return result
|
||||||
|
|
||||||
|
|
||||||
def get_friends_recent_matches():
|
def get_friends_recent_matches():
|
||||||
matches = []
|
matches = []
|
||||||
|
global streak_updates # 使用全局变量存储连胜连败更新
|
||||||
|
streak_updates = []
|
||||||
|
|
||||||
for friend in Friend.filter(active=True):
|
for friend in Friend.filter(active=True):
|
||||||
for match_ in friend.get_recent_matches():
|
for match_ in friend.get_recent_matches():
|
||||||
if not Match.select().where(Match.match_id == match_.match_id).exists():
|
if not Match.select().where(Match.match_id == match_.match_id).exists():
|
||||||
@ -228,7 +267,17 @@ def get_friends_recent_matches():
|
|||||||
radiant_win=match_.radiant_win,
|
radiant_win=match_.radiant_win,
|
||||||
party_size=match_.party_size,
|
party_size=match_.party_size,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
# 判断玩家是否获胜
|
||||||
|
player_won = match_.radiant_win == (match_.player_slot < 128)
|
||||||
|
|
||||||
|
# 更新连胜连败
|
||||||
|
streak_info = friend.update_streak(match_.match_id, player_won)
|
||||||
|
if streak_info:
|
||||||
|
streak_updates.append(streak_info)
|
||||||
|
|
||||||
matches.append(match_obj.serialize_match())
|
matches.append(match_obj.serialize_match())
|
||||||
|
|
||||||
return matches
|
return matches
|
||||||
|
|
||||||
|
|
||||||
@ -421,3 +470,31 @@ def check_rank_changes_for_discord():
|
|||||||
})
|
})
|
||||||
|
|
||||||
return data
|
return data
|
||||||
|
|
||||||
|
|
||||||
|
def check_streaks():
|
||||||
|
"""检查连胜连败并返回通知消息"""
|
||||||
|
global streak_updates
|
||||||
|
notifications = []
|
||||||
|
|
||||||
|
for update in streak_updates:
|
||||||
|
# 连胜达到3场或以上
|
||||||
|
if update['win_streak'] >= 3:
|
||||||
|
notifications.append(f"🔥 **{update['name']}** 正在**{update['win_streak']}连胜**!")
|
||||||
|
|
||||||
|
# 连败达到3场或以上
|
||||||
|
if update['loss_streak'] >= 3:
|
||||||
|
notifications.append(f"💔 **{update['name']}** 正在**{update['loss_streak']}连败**!")
|
||||||
|
|
||||||
|
# 连胜被终结
|
||||||
|
if update['win_streak_broken'] and update['old_win_streak'] >= 3:
|
||||||
|
notifications.append(f"⚡ **{update['name']}** 的**{update['old_win_streak']}连胜**被终结了!")
|
||||||
|
|
||||||
|
# 连败被终结
|
||||||
|
if update['loss_streak_broken'] and update['old_loss_streak'] >= 3:
|
||||||
|
notifications.append(f"🌈 **{update['name']}** 终于结束了**{update['old_loss_streak']}连败**!")
|
||||||
|
|
||||||
|
# 清空更新列表,避免重复通知
|
||||||
|
streak_updates = []
|
||||||
|
|
||||||
|
return notifications
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user