1
0
mirror of synced 2024-11-27 23:50:47 +01:00

Add discord webhook support for Popn

This commit is contained in:
cracrayol 2021-09-04 18:06:00 +02:00
parent c8ebe18ebb
commit c64efa5860
7 changed files with 71 additions and 6 deletions

View File

@ -3,7 +3,7 @@ from typing import Dict, Optional, Sequence
from bemani.backend.base import Base
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.protocol import Node
@ -289,3 +289,47 @@ class PopnMusicBase(CoreHandler, CardManagerHandler, PASELIHandler, Base):
# We saved successfully
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)

View File

@ -435,6 +435,10 @@ class PopnMusicEclale(PopnMusicBase):
self.GAME_PLAY_MEDAL_PERFECT: self.PLAY_MEDAL_PERFECT,
}[medal]
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
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('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
info = Node.void('info')
root.add_child(info)

View File

@ -686,6 +686,10 @@ class PopnMusicUsaNeko(PopnMusicBase):
self.GAME_PLAY_MEDAL_PERFECT: self.PLAY_MEDAL_PERFECT,
}[medal]
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
def handle_player24_start_request(self, request: Node) -> Node:
@ -922,7 +926,7 @@ class PopnMusicUsaNeko(PopnMusicBase):
# eAmuse account link
eaappli = Node.void('eaappli')
root.add_child(eaappli)
eaappli.add_child(Node.s8('relation', -1))
eaappli.add_child(Node.s8('relation', 1))
# Player info
info = Node.void('info')

View File

@ -314,3 +314,10 @@ class BroadcastConstants(Enum):
FASTS: Final[str] = 'Fast'
GRADE: Final[str] = 'Grade'
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'

View File

@ -33,7 +33,7 @@ class Triggers:
self.broadcast_score_discord(data, game, song)
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()
webhook = DiscordWebhook(url=self.config.webhooks.discord[game])
@ -45,7 +45,7 @@ class Triggers:
scoreembed.set_author(name=self.config.name, url=song_url)
for item, value in data.items():
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
scoreembed.add_embed_field(name=item.value, value=value, inline=inline)
webhook.add_embed(scoreembed)

View File

@ -15,7 +15,7 @@ from bemani.frontend.types import g
popn_pages = Blueprint(
'popn_pages',
__name__,
url_prefix='/popn',
url_prefix='/pnm',
template_folder=templates_location,
static_folder=static_location,
)

View File

@ -40,7 +40,8 @@ webhooks:
discord:
iidx:
- "https://discord.com/api/webhooks/1232122131321321321/eauihfafaewfhjaveuijaewuivhjawueihoi"
pnm:
- "https://discord.com/api/webhooks/1232122131321321321/eauihfafaewfhjaveuijaewuivhjawueihoi"
paseli:
# Whether PASELI is enabled on the network.
enabled: True