Files
JKTV-online/web/services/discovery_service.py
T

164 lines
4.8 KiB
Python

import json
from web.database import query_db
class DiscoveryService:
TONE_LABELS = {
'positive': '高光',
'negative': '低谷',
'fun': '趣味',
}
MEDAL_LABELS = {
'gold': '金牌',
'silver': '银牌',
'bronze': '铜牌',
}
@staticmethod
def _identity_map(steam_ids):
steam_ids = sorted({str(value) for value in steam_ids if value})
if not steam_ids:
return {}
placeholders = ','.join('?' for _ in steam_ids)
rows = query_db(
'l2',
f"""
SELECT steam_id_64, username, avatar_url
FROM dim_players
WHERE steam_id_64 IN ({placeholders})
""",
steam_ids,
)
return {str(row['steam_id_64']): dict(row) for row in rows}
@staticmethod
def get_insights(tone=None):
args = []
where = ''
if tone in DiscoveryService.TONE_LABELS:
where = 'WHERE tone = ?'
args.append(tone)
rows = query_db(
'l3',
f"""
SELECT *
FROM dm_discovery_insights
{where}
ORDER BY display_order, insight_key
""",
args,
)
identities = DiscoveryService._identity_map(
[row['steam_id_64'] for row in rows]
)
result = []
for row in rows:
item = dict(row)
item['identity'] = identities.get(str(item['steam_id_64']), {})
item['tone_label'] = DiscoveryService.TONE_LABELS.get(
item['tone'],
item['tone'],
)
try:
item['evidence'] = json.loads(item['evidence_json'] or '{}')
except json.JSONDecodeError:
item['evidence'] = {}
result.append(item)
return result
@staticmethod
def get_medals(dimension_type=None):
args = []
where = ''
if dimension_type in {'map', 'elo'}:
where = 'WHERE dimension_type = ?'
args.append(dimension_type)
rows = query_db(
'l3',
f"""
SELECT *
FROM dm_performance_medals
{where}
ORDER BY
CASE dimension_type WHEN 'map' THEN 1 ELSE 2 END,
dimension_key,
medal_rank
""",
args,
)
identities = DiscoveryService._identity_map(
[row['steam_id_64'] for row in rows]
)
grouped = []
current_key = None
current = None
for row in rows:
item = dict(row)
item['identity'] = identities.get(str(item['steam_id_64']), {})
item['medal_label'] = DiscoveryService.MEDAL_LABELS.get(
item['medal_tier'],
item['medal_tier'],
)
key = (item['dimension_type'], item['dimension_key'])
if key != current_key:
current = {
'dimension_type': item['dimension_type'],
'dimension_key': item['dimension_key'],
'dimension_label': item['dimension_label'],
'medals': [],
}
grouped.append(current)
current_key = key
current['medals'].append(item)
return grouped
@staticmethod
def get_medal_leaderboard():
rows = query_db(
'l3',
"""
SELECT
steam_id_64,
COUNT(*) AS medals,
SUM(CASE WHEN medal_tier = 'gold' THEN 1 ELSE 0 END) AS gold,
SUM(CASE WHEN medal_tier = 'silver' THEN 1 ELSE 0 END) AS silver,
SUM(CASE WHEN medal_tier = 'bronze' THEN 1 ELSE 0 END) AS bronze
FROM dm_performance_medals
GROUP BY steam_id_64
ORDER BY gold DESC, silver DESC, bronze DESC
""",
)
identities = DiscoveryService._identity_map(
[row['steam_id_64'] for row in rows]
)
result = []
for row in rows:
item = dict(row)
item['identity'] = identities.get(str(item['steam_id_64']), {})
result.append(item)
return result
@staticmethod
def get_player_medals(steam_id):
rows = query_db(
'l3',
"""
SELECT *
FROM dm_performance_medals
WHERE steam_id_64 = ?
ORDER BY medal_rank, dimension_type, dimension_key
""",
[steam_id],
)
result = []
for row in rows:
item = dict(row)
item['medal_label'] = DiscoveryService.MEDAL_LABELS.get(
item['medal_tier'],
item['medal_tier'],
)
result.append(item)
return result