Release beta 1.0.5 primogem economy
This commit is contained in:
@@ -1,5 +1,5 @@
|
||||
#!/usr/bin/env python3
|
||||
"""Apply the mandatory post-release Mora grant and group announcement."""
|
||||
"""Apply the mandatory post-release grant and group announcement."""
|
||||
|
||||
from __future__ import annotations
|
||||
|
||||
@@ -26,11 +26,15 @@ sys.path[:0] = [
|
||||
from jwebot_official_extensions import __version__ as OFFICIAL_VERSION # noqa: E402
|
||||
from jwebot_official_extensions.player_games import ( # noqa: E402
|
||||
append_coin_event,
|
||||
append_primogem_event,
|
||||
normalize_player_account,
|
||||
)
|
||||
|
||||
|
||||
COMPENSATION_AMOUNT = 200
|
||||
PRIMOGEM_COMPENSATION_RELEASES = {
|
||||
"beta 1.0.5.1016": 1,
|
||||
}
|
||||
MAX_BALANCE = 1_000_000_000
|
||||
MAX_SUMMARY_CHARS = 300
|
||||
MAX_ANNOUNCEMENT_CHARS = 900
|
||||
@@ -39,7 +43,7 @@ RELEASE_PATTERN = re.compile(
|
||||
)
|
||||
CHANGELOG_HEADING = re.compile(
|
||||
r"^##\s+(?P<release>beta \d+\.\d+\.\d+\.\d{4})"
|
||||
r"(?:\s+-\s+\d{4}-\d{2}-\d{2})?\s*$"
|
||||
r"(?:\s+-\s+\d{4}-\d{2}-\d{2}(?:\s+\d{2}:\d{2}:\d{2})?)?\s*$"
|
||||
)
|
||||
|
||||
|
||||
@@ -119,11 +123,13 @@ def read_changelog_summary(path: Path, release: str) -> str:
|
||||
|
||||
|
||||
def build_announcement(release: str, summary: str) -> str:
|
||||
primogems = primogem_compensation_amount(release)
|
||||
extra = f",原石 x{primogems}" if primogems else ""
|
||||
announcement = (
|
||||
"亲爱的群友:\n"
|
||||
f"{release} 更新现已完成。\n"
|
||||
f"更新内容:{summary}\n"
|
||||
f"更新补偿:摩拉 x{COMPENSATION_AMOUNT}\n"
|
||||
f"更新补偿:摩拉 x{COMPENSATION_AMOUNT}{extra}\n"
|
||||
"补偿范围:截至本公告发布前已创建摩拉账户的玩家\n"
|
||||
"发放方式:补偿已直接到账,无需领取\n"
|
||||
"感谢大家对 Taffy 的支持与理解,祝大家游戏愉快!"
|
||||
@@ -137,6 +143,10 @@ def compensation_key(release: str) -> str:
|
||||
return f"release_compensation:{release}"
|
||||
|
||||
|
||||
def primogem_compensation_amount(release: str) -> int:
|
||||
return int(PRIMOGEM_COMPENSATION_RELEASES.get(release, 0))
|
||||
|
||||
|
||||
def announcement_key(release: str, group_fingerprint: str) -> str:
|
||||
group_hash = hashlib.sha256(group_fingerprint.encode()).hexdigest()
|
||||
return f"release_announcement:{release}:{group_hash}"
|
||||
@@ -147,6 +157,7 @@ def release_slug(release: str) -> str:
|
||||
|
||||
|
||||
def checked_marker(raw: str, release: str) -> dict[str, Any]:
|
||||
expected_primogems = primogem_compensation_amount(release)
|
||||
try:
|
||||
marker = json.loads(raw)
|
||||
except json.JSONDecodeError as error:
|
||||
@@ -155,6 +166,8 @@ def checked_marker(raw: str, release: str) -> dict[str, Any]:
|
||||
not isinstance(marker, dict)
|
||||
or marker.get("release") != release
|
||||
or marker.get("amount") != COMPENSATION_AMOUNT
|
||||
or marker.get("mora_amount") not in {None, COMPENSATION_AMOUNT}
|
||||
or marker.get("primogem_amount") not in {None, expected_primogems}
|
||||
or not isinstance(marker.get("group_fingerprints"), list)
|
||||
):
|
||||
raise ReleaseUpdateError("release compensation marker does not match")
|
||||
@@ -234,8 +247,11 @@ def apply_compensation(
|
||||
).fetchall()
|
||||
groups = sorted({str(row["group_fingerprint"]) for row in rows})
|
||||
old_balance_sum = 0
|
||||
old_primogem_sum = 0
|
||||
primogem_amount = primogem_compensation_amount(release)
|
||||
timestamp = isoformat_utc(applied_at)
|
||||
event_reason = f"{release} 版本更新补偿"
|
||||
primogem_reason = f"{release} 版本更新补偿"
|
||||
for row in rows:
|
||||
try:
|
||||
state = json.loads(str(row["state_json"]))
|
||||
@@ -251,9 +267,20 @@ def apply_compensation(
|
||||
):
|
||||
raise ReleaseUpdateError("Mora account balance is invalid")
|
||||
old_balance_sum += balance
|
||||
old_primogem_sum += int(state["primogems"])
|
||||
state["balance"] = balance + COMPENSATION_AMOUNT
|
||||
state["primogems"] += primogem_amount
|
||||
append_coin_event(state, COMPENSATION_AMOUNT, event_reason)
|
||||
state["coin_events"][-1]["created_at"] = applied_at.timestamp()
|
||||
if primogem_amount:
|
||||
append_primogem_event(
|
||||
state,
|
||||
primogem_amount,
|
||||
primogem_reason,
|
||||
)
|
||||
state["primogem_events"][-1]["created_at"] = (
|
||||
applied_at.timestamp()
|
||||
)
|
||||
connection.execute(
|
||||
"""
|
||||
UPDATE player_accounts
|
||||
@@ -270,12 +297,18 @@ def apply_compensation(
|
||||
marker = {
|
||||
"release": release,
|
||||
"amount": COMPENSATION_AMOUNT,
|
||||
"mora_amount": COMPENSATION_AMOUNT,
|
||||
"primogem_amount": primogem_amount,
|
||||
"accounts": len(rows),
|
||||
"group_fingerprints": groups,
|
||||
"old_balance_sum": old_balance_sum,
|
||||
"new_balance_sum": (
|
||||
old_balance_sum + COMPENSATION_AMOUNT * len(rows)
|
||||
),
|
||||
"old_primogem_sum": old_primogem_sum,
|
||||
"new_primogem_sum": (
|
||||
old_primogem_sum + primogem_amount * len(rows)
|
||||
),
|
||||
"applied_at": timestamp,
|
||||
"backup": backup_path.name,
|
||||
}
|
||||
@@ -523,6 +556,7 @@ def run_release_update(
|
||||
"release": release,
|
||||
"compensation": compensation_state,
|
||||
"amount_each": COMPENSATION_AMOUNT,
|
||||
"primogems_each": primogem_compensation_amount(release),
|
||||
"accounts": int(marker["accounts"]),
|
||||
"groups": len(groups),
|
||||
"announcements_delivered": announcement_result["delivered"],
|
||||
|
||||
Reference in New Issue
Block a user