-
Notifications
You must be signed in to change notification settings - Fork 0
/
FB.py
128 lines (111 loc) · 5.67 KB
/
FB.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
#! /usr/bin/env python3
from sys import argv, stderr
from datetime import datetime
import re
from util import DATA
import util
import mapUtil
from scenario import Conversation, StoryNavBar
from reward import parseReward
from Reverse import reverseForgingBonds
from wikiUtil import exportPage, getPageContent
FB_COLORS = ['Red', 'Orange', 'Green', 'Blue']
def FBInfobox(data):
# Perform a cargo query to get forging bonds number.
return "{{Forging Bonds Infobox" + \
"\n|number=" + str(int(util.cargoQuery('ForgingBonds', 'COUNT(DISTINCT _pageName)=Nb')[0]['Nb']) + 1) + \
"\n|characters=" + ",".join([util.getName(unit) for unit in data['units']]) + \
"\n|accessories=" + ",".join([util.getName(acc) for acc in data['bonus_accessories']]) + \
"\n|startTime=" + data['event_avail']['start'] + \
"\n|endTime=" + util.timeDiff(data['event_avail']['finish']) + \
"\n}}"
def FBRewards(data):
s = "==Rewards==\n{{#invoke:Reward/ForgingBonds|main"
s += "\n|wikiname=" + util.cleanStr(f"{util.getName(data['title'])} {datetime.strptime(data['event_avail']['start'], util.TIME_FORMAT).strftime('%Y%m%d')}")
for i, color in enumerate(FB_COLORS):
s += f"\n|{color}={{"
for r in data['hero_rewards']:
if r['unit'] == i+1:
s += f"\n {r['score']}={parseReward(r['reward'])};"
s += "\n}"
# For original FB, Summoning tickets are First Summon Ticket I from the first revival, 2020-06-05
s = re.sub(r"<!--Summoning Ticket: \[[^]]*\]-->", "First Summon Ticket I", s)
s += "\n}}"
return s
def FBConversation(data):
s = "==Special conversations==\n"
s += f"==={util.getName(data['title'])}===\n"
s += f"===={util.getName(data['title'])} - Opening====\n"
s += Conversation(f"PORTRAIT_{data['original_id_tag']}", "MID_SCENARIO_OPENING")
for t in ['C', 'B', 'A']:
s += f"\n===={util.getName(data['title'])} - {t}====\n"
s += "{{tab/start}}{{tab/header|English}}\n{{StoryTextTableHeader}}\n" + \
"{{StoryImage|}}\n{{StoryTextTable||}}\n{{StoryTextTableEnd}}\n" + \
"{{tab/header|Japanese}}\n{{StoryTextTableHeader}}\n{{StoryImage|}}\n" + \
"{{StoryTextTable|||ja}}\n{{StoryTextTableEnd}}\n{{tab/end}}"
for unit in [util.getName(u) for u in data['units']]:
s += f"\n==={unit}==="
for t in ['C', 'B', 'A', 'S']:
s += f"\n===={unit} - {t}====\n"
s += "{{tab/start}}{{tab/header|English}}\n" +\
"{{StoryTextTableHeader}}\n{{StoryImage|}}\n" +\
"{{StoryTextTable|"+unit+"|}}\n{{StoryTextTableEnd}}\n" + \
"{{tab/header|Japanese}}\n{{StoryTextTableHeader}}\n{{StoryImage|}}\n" + \
"{{StoryTextTable|"+unit+"||ja}}\n{{StoryTextTableEnd}}\n{{tab/end}}"
s += "\n" + StoryNavBar(util.getName(data['title']), "", "")
return s
def ForgingBondsOriginal(data):
if data["id_tag"] != data["original_id_tag"]:
raise ValueError("Given Forging Bonds is a revival")
s = FBInfobox(data) + "\n"
s += mapUtil.Availability(data['event_avail'], f"Forging Bonds: {util.getName(data['title'])} (Notification)", "[[Forging Bonds]] event") + "\n"
s += FBRewards(data) + "\n"
s += FBConversation(data) + "\n"
s += mapUtil.InOtherLanguage(data['title'])
s += "{{Main Events Navbox}}"
return (util.getName(data['title']), s)
def ForgingBondsRevival(data):
if data["id_tag"] == data["original_id_tag"]:
raise ValueError("Given Forging Bonds is not a revival")
data["title"] = data["title"].replace(data['id_tag'], data['original_id_tag'])
name = util.getName(data["title"])
page = getPageContent([name])[name]
start = data["event_avail"]["start"]
end = util.timeDiff(data["event_avail"]["finish"])
wikiname = util.cleanStr(f"{name} {datetime.strptime(data['event_avail']['start'], util.TIME_FORMAT).strftime('%Y%m%d')}")
rewards = FBRewards(data).replace("First Summon Ticket I", "First Summon Ticket II").replace("==Rewards==\n", "")
if page.find(start) == -1:
page = re.sub(r"(\|startTime=.*)\n", f"\\1;{start}\n", page)
if page.find(end) == -1:
page = re.sub(r"(\|endTime=.*)\n", f"\\1;{end}\n", page)
if page.count("(Notification)") == 1:
page = re.sub(r"((?:\*\s*\{\{\s*HT\s*\|.*\n)+)", f"\\1* {{{{HT|{start}}}}} – {{{{HT|{end}}}}} ([[Forging Bonds Revival: {name} (Notification)|Notification]])\n", page)
if not re.search(r"===\s*Original [rR]un\s*===", page):
page = re.sub("(==\s*Rewards\s*==\n)", "\\1===Original run===\n", page)
if not re.search(f"wikiname\\s*=\\s*{wikiname}", page):
page = re.sub(r"\}\}\n(\n*==\s*Special [cC]onversations\s*==)", "}}\n===Rerun===\n"+rewards+"\n\\1", page)
return (name, page)
def ForgingBonds(tagId: str) -> dict:
datas = reverseForgingBonds(tagId)
content = {}
for data in datas:
if data["id_tag"] == data["original_id_tag"]:
name, page = ForgingBondsOriginal(data)
else:
name, page = ForgingBondsRevival(data)
content[name] = page
return content
def exportForgingBonds(tagId: str):
content = ForgingBonds(tagId)
for name in content:
isRevival = True if re.search(r"===\s*Rerun\s*===", content[name]) else False
exportPage(name, content[name], 'Bot: Forging Bonds revival' if isRevival else 'Bot: new Forging Bonds', create=-1)
return content
if __name__ == '__main__':
for arg in argv[1:]:
if re.match(r'^\d+_\w+|v\d{4}[a-e]_\w+$', arg):
a = ForgingBonds(arg)
for k in a:
print(k, a[k])
else:
print("A tagId (\\d+_\\w+) is expected, but got '"+arg+"'")