Add discord webhook support for Popn
This commit is contained in:
parent
c8ebe18ebb
commit
c64efa5860
@ -3,7 +3,7 @@ from typing import Dict, Optional, Sequence
|
|||||||
|
|
||||||
from bemani.backend.base import Base
|
from bemani.backend.base import Base
|
||||||
from bemani.backend.core import CoreHandler, CardManagerHandler, PASELIHandler
|
from bemani.backend.core import CoreHandler, CardManagerHandler, PASELIHandler
|
||||||
from bemani.common import Profile, ValidatedDict, Time, GameConstants, DBConstants
|
from bemani.common import Profile, ValidatedDict, Time, GameConstants, DBConstants, BroadcastConstants
|
||||||
from bemani.data import UserID, Achievement, ScoreSaveException
|
from bemani.data import UserID, Achievement, ScoreSaveException
|
||||||
from bemani.protocol import Node
|
from bemani.protocol import Node
|
||||||
|
|
||||||
@ -289,3 +289,47 @@ class PopnMusicBase(CoreHandler, CardManagerHandler, PASELIHandler, Base):
|
|||||||
|
|
||||||
# We saved successfully
|
# We saved successfully
|
||||||
break
|
break
|
||||||
|
|
||||||
|
def broadcast_score(self, userid: int, songid: int, chart: int, medal: int, points: int, combo: int, stats: Dict[str,int]) -> None:
|
||||||
|
# Generate scorecard
|
||||||
|
profile = self.get_profile(userid)
|
||||||
|
song = self.data.local.music.get_song(self.game, self.version, songid, chart)
|
||||||
|
|
||||||
|
card_medal = {
|
||||||
|
self.PLAY_MEDAL_CIRCLE_FAILED: 'Failed',
|
||||||
|
self.PLAY_MEDAL_DIAMOND_FAILED: 'Failed',
|
||||||
|
self.PLAY_MEDAL_STAR_FAILED: 'Failed',
|
||||||
|
self.PLAY_MEDAL_EASY_CLEAR: 'Cleared',
|
||||||
|
self.PLAY_MEDAL_CIRCLE_CLEARED: 'Cleared',
|
||||||
|
self.PLAY_MEDAL_DIAMOND_CLEARED: 'Cleared',
|
||||||
|
self.PLAY_MEDAL_STAR_CLEARED: 'Cleared',
|
||||||
|
self.PLAY_MEDAL_CIRCLE_FULL_COMBO: 'Full Combo',
|
||||||
|
self.PLAY_MEDAL_DIAMOND_FULL_COMBO: 'Full Combo',
|
||||||
|
self.PLAY_MEDAL_STAR_FULL_COMBO: 'Full Combo',
|
||||||
|
self.PLAY_MEDAL_PERFECT: 'Perfect',
|
||||||
|
}[medal]
|
||||||
|
|
||||||
|
card_chart = {
|
||||||
|
self.CHART_TYPE_EASY: 'Easy',
|
||||||
|
self.CHART_TYPE_NORMAL: 'Normal',
|
||||||
|
self.CHART_TYPE_HYPER: 'Hyper',
|
||||||
|
self.CHART_TYPE_EX: 'Ex',
|
||||||
|
}[chart]
|
||||||
|
|
||||||
|
# Construct the dictionary for the broadcast
|
||||||
|
card_data = {
|
||||||
|
BroadcastConstants.PLAYER_NAME: profile.get_str('name', 'なし'),
|
||||||
|
BroadcastConstants.SONG_NAME: song.name,
|
||||||
|
BroadcastConstants.ARTIST_NAME: song.artist,
|
||||||
|
BroadcastConstants.DIFFICULTY: card_chart,
|
||||||
|
BroadcastConstants.SCORE: points,
|
||||||
|
BroadcastConstants.MEDAL: card_medal,
|
||||||
|
BroadcastConstants.COOLS: stats['cool'],
|
||||||
|
BroadcastConstants.GREATS: stats['great'],
|
||||||
|
BroadcastConstants.GOODS: stats['good'],
|
||||||
|
BroadcastConstants.BADS: stats['bad'],
|
||||||
|
BroadcastConstants.COMBO: combo,
|
||||||
|
}
|
||||||
|
|
||||||
|
# Try to broadcast out the score to our webhook(s)
|
||||||
|
self.data.triggers.broadcast_score(card_data, self.game, song)
|
||||||
|
@ -435,6 +435,10 @@ class PopnMusicEclale(PopnMusicBase):
|
|||||||
self.GAME_PLAY_MEDAL_PERFECT: self.PLAY_MEDAL_PERFECT,
|
self.GAME_PLAY_MEDAL_PERFECT: self.PLAY_MEDAL_PERFECT,
|
||||||
}[medal]
|
}[medal]
|
||||||
self.update_score(userid, songid, chart, points, medal, combo=combo, stats=stats)
|
self.update_score(userid, songid, chart, points, medal, combo=combo, stats=stats)
|
||||||
|
|
||||||
|
if request.child_value('is_image_store') == 1:
|
||||||
|
self.broadcast_score(userid, songid, chart, medal, combo, stats)
|
||||||
|
|
||||||
return root
|
return root
|
||||||
|
|
||||||
def format_conversion(self, userid: UserID, profile: Profile) -> Node:
|
def format_conversion(self, userid: UserID, profile: Profile) -> Node:
|
||||||
@ -551,6 +555,11 @@ class PopnMusicEclale(PopnMusicBase):
|
|||||||
account.add_child(Node.s16('total_days', statistics.total_days))
|
account.add_child(Node.s16('total_days', statistics.total_days))
|
||||||
account.add_child(Node.s16('interval_day', 0))
|
account.add_child(Node.s16('interval_day', 0))
|
||||||
|
|
||||||
|
# eAmuse account link
|
||||||
|
eaappli = Node.void('eaappli')
|
||||||
|
root.add_child(eaappli)
|
||||||
|
eaappli.add_child(Node.s8('relation', 1))
|
||||||
|
|
||||||
# Set up info node
|
# Set up info node
|
||||||
info = Node.void('info')
|
info = Node.void('info')
|
||||||
root.add_child(info)
|
root.add_child(info)
|
||||||
|
@ -686,6 +686,10 @@ class PopnMusicUsaNeko(PopnMusicBase):
|
|||||||
self.GAME_PLAY_MEDAL_PERFECT: self.PLAY_MEDAL_PERFECT,
|
self.GAME_PLAY_MEDAL_PERFECT: self.PLAY_MEDAL_PERFECT,
|
||||||
}[medal]
|
}[medal]
|
||||||
self.update_score(userid, songid, chart, points, medal, combo=combo, stats=stats)
|
self.update_score(userid, songid, chart, points, medal, combo=combo, stats=stats)
|
||||||
|
|
||||||
|
if request.child_value('is_image_store') == 1:
|
||||||
|
self.broadcast_score(userid, songid, chart, medal, combo, stats)
|
||||||
|
|
||||||
return root
|
return root
|
||||||
|
|
||||||
def handle_player24_start_request(self, request: Node) -> Node:
|
def handle_player24_start_request(self, request: Node) -> Node:
|
||||||
@ -922,7 +926,7 @@ class PopnMusicUsaNeko(PopnMusicBase):
|
|||||||
# eAmuse account link
|
# eAmuse account link
|
||||||
eaappli = Node.void('eaappli')
|
eaappli = Node.void('eaappli')
|
||||||
root.add_child(eaappli)
|
root.add_child(eaappli)
|
||||||
eaappli.add_child(Node.s8('relation', -1))
|
eaappli.add_child(Node.s8('relation', 1))
|
||||||
|
|
||||||
# Player info
|
# Player info
|
||||||
info = Node.void('info')
|
info = Node.void('info')
|
||||||
|
@ -314,3 +314,10 @@ class BroadcastConstants(Enum):
|
|||||||
FASTS: Final[str] = 'Fast'
|
FASTS: Final[str] = 'Fast'
|
||||||
GRADE: Final[str] = 'Grade'
|
GRADE: Final[str] = 'Grade'
|
||||||
RATE: Final[str] = 'Score Rate'
|
RATE: Final[str] = 'Score Rate'
|
||||||
|
|
||||||
|
# Added for Pnm
|
||||||
|
PLAYER_NAME: Final[str] = 'Player Name'
|
||||||
|
SCORE: Final[str] = 'Your Score'
|
||||||
|
COOLS: Final[str] = 'Cools'
|
||||||
|
COMBO: Final[str] = 'Combo'
|
||||||
|
MEDAL: Final[str] = 'Medal'
|
||||||
|
@ -33,7 +33,7 @@ class Triggers:
|
|||||||
self.broadcast_score_discord(data, game, song)
|
self.broadcast_score_discord(data, game, song)
|
||||||
|
|
||||||
def broadcast_score_discord(self, data: Dict[BroadcastConstants, str], game: GameConstants, song: Song) -> None:
|
def broadcast_score_discord(self, data: Dict[BroadcastConstants, str], game: GameConstants, song: Song) -> None:
|
||||||
if game == GameConstants.IIDX:
|
if game in [GameConstants.IIDX, GameConstants.POPN_MUSIC] :
|
||||||
now = datetime.now()
|
now = datetime.now()
|
||||||
|
|
||||||
webhook = DiscordWebhook(url=self.config.webhooks.discord[game])
|
webhook = DiscordWebhook(url=self.config.webhooks.discord[game])
|
||||||
@ -45,7 +45,7 @@ class Triggers:
|
|||||||
scoreembed.set_author(name=self.config.name, url=song_url)
|
scoreembed.set_author(name=self.config.name, url=song_url)
|
||||||
for item, value in data.items():
|
for item, value in data.items():
|
||||||
inline = True
|
inline = True
|
||||||
if item in {BroadcastConstants.DJ_NAME, BroadcastConstants.SONG_NAME, BroadcastConstants.ARTIST_NAME, BroadcastConstants.PLAY_STATS_HEADER}:
|
if item in {BroadcastConstants.DJ_NAME, BroadcastConstants.PLAYER_NAME, BroadcastConstants.SONG_NAME, BroadcastConstants.ARTIST_NAME, BroadcastConstants.PLAY_STATS_HEADER}:
|
||||||
inline = False
|
inline = False
|
||||||
scoreembed.add_embed_field(name=item.value, value=value, inline=inline)
|
scoreembed.add_embed_field(name=item.value, value=value, inline=inline)
|
||||||
webhook.add_embed(scoreembed)
|
webhook.add_embed(scoreembed)
|
||||||
|
@ -15,7 +15,7 @@ from bemani.frontend.types import g
|
|||||||
popn_pages = Blueprint(
|
popn_pages = Blueprint(
|
||||||
'popn_pages',
|
'popn_pages',
|
||||||
__name__,
|
__name__,
|
||||||
url_prefix='/popn',
|
url_prefix='/pnm',
|
||||||
template_folder=templates_location,
|
template_folder=templates_location,
|
||||||
static_folder=static_location,
|
static_folder=static_location,
|
||||||
)
|
)
|
||||||
|
@ -40,7 +40,8 @@ webhooks:
|
|||||||
discord:
|
discord:
|
||||||
iidx:
|
iidx:
|
||||||
- "https://discord.com/api/webhooks/1232122131321321321/eauihfafaewfhjaveuijaewuivhjawueihoi"
|
- "https://discord.com/api/webhooks/1232122131321321321/eauihfafaewfhjaveuijaewuivhjawueihoi"
|
||||||
|
pnm:
|
||||||
|
- "https://discord.com/api/webhooks/1232122131321321321/eauihfafaewfhjaveuijaewuivhjawueihoi"
|
||||||
paseli:
|
paseli:
|
||||||
# Whether PASELI is enabled on the network.
|
# Whether PASELI is enabled on the network.
|
||||||
enabled: True
|
enabled: True
|
||||||
|
Loading…
Reference in New Issue
Block a user