From 769a4680e5aa9dcd0e7b4947df6af2c4d7122121 Mon Sep 17 00:00:00 2001 From: David James Date: Sun, 1 Aug 2021 19:48:11 +1000 Subject: [PATCH 1/3] initial work on push to wiki --- push-to-wiki.py | 83 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 83 insertions(+) create mode 100644 push-to-wiki.py diff --git a/push-to-wiki.py b/push-to-wiki.py new file mode 100644 index 000000000..b1a8a5b9e --- /dev/null +++ b/push-to-wiki.py @@ -0,0 +1,83 @@ +import json +import os +import requests + + +class WikiApi: + def __init__(self): + self.url = os.getenv("WIKI_API_URL") + self.username = os.getenv("WIKI_USERNAME") + self.password = os.getenv("WIKI_PASSWORD") + self.session = requests.Session() + self.auth = (os.getenv("WIKI_API_USERNAME"), os.getenv("WIKI_API_PASSWORD")) + + def login(self): + # Retrieve login token first + params = { + "action": "query", + "meta": "tokens", + "type": "login", + "format": "json", + } + + request = self.session.get(url=self.url, params=params, auth=self.auth) + data = request.json() + + token = data["query"]["tokens"]["logintoken"] + + # Send a post request to login. Using the main account for login is not + # supported. Obtain credentials via Special:BotPasswords + # (https://www.mediawiki.org/wiki/Special:BotPasswords) for lgname & lgpassword + + params = { + "action": "login", + "lgname": self.username, + "lgpassword": self.password, + "lgtoken": token, + "format": "json", + } + + request = self.session.post(self.url, data=params, auth=self.auth) + return request.json() + + def update_wiki(self, page, content, summary): + # Step 3: GET request to fetch CSRF token + params = {"action": "query", "meta": "tokens", "format": "json"} + + request = self.session.get(url=self.url, params=params, auth=self.auth) + data = request.json() + + token = data["query"]["tokens"]["csrftoken"] + + # Step 4: POST request to edit a page + params = { + "action": "edit", + "title": page, + "token": token, + "format": "json", + "bot": True, + "summary": summary, + "text": content, + } + + request = self.session.post(self.url, data=params, auth=self.auth) + data = request.json() + return data + + def load_files(self, schema_name): + files = sorted(os.listdir(schema_name)) + + for filename in files: + if filename.endswith(".json"): + filepath = os.path.join(schema_name, filename) + f = open(filepath) + + # Load and dump to validate that we have a json file + data = json.loads(f.read()) + + print(f"Pushed {filename}") + + +wiki = WikiApi() + +wiki.load_files("buildings") From 398968dd52fcbdca8fcebc4f6d101b7037648b9f Mon Sep 17 00:00:00 2001 From: David James Date: Sun, 1 Aug 2021 21:29:24 +1000 Subject: [PATCH 2/3] working wiki push --- requirements.txt | 1 + push-to-wiki.py => wiki/push-to-wiki.py | 29 ++++++++++++++++++++----- wiki/templates/buildings.j2 | 12 ++++++++++ wiki/templates/buildings_menu.j2 | 6 +++++ 4 files changed, 42 insertions(+), 6 deletions(-) create mode 100644 requirements.txt rename push-to-wiki.py => wiki/push-to-wiki.py (67%) create mode 100644 wiki/templates/buildings.j2 create mode 100644 wiki/templates/buildings_menu.j2 diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 000000000..1c579e7d0 --- /dev/null +++ b/requirements.txt @@ -0,0 +1 @@ +jinja2 \ No newline at end of file diff --git a/push-to-wiki.py b/wiki/push-to-wiki.py similarity index 67% rename from push-to-wiki.py rename to wiki/push-to-wiki.py index b1a8a5b9e..adbfa38b6 100644 --- a/push-to-wiki.py +++ b/wiki/push-to-wiki.py @@ -1,13 +1,14 @@ import json import os import requests +from jinja2 import Template class WikiApi: def __init__(self): self.url = os.getenv("WIKI_API_URL") - self.username = os.getenv("WIKI_USERNAME") - self.password = os.getenv("WIKI_PASSWORD") + self.username = os.getenv("WIKI_API_USERNAME") + self.password = os.getenv("WIKI_API_PASSWORD") self.session = requests.Session() self.auth = (os.getenv("WIKI_API_USERNAME"), os.getenv("WIKI_API_PASSWORD")) @@ -42,6 +43,7 @@ def login(self): def update_wiki(self, page, content, summary): # Step 3: GET request to fetch CSRF token + self.login() params = {"action": "query", "meta": "tokens", "format": "json"} request = self.session.get(url=self.url, params=params, auth=self.auth) @@ -53,29 +55,44 @@ def update_wiki(self, page, content, summary): params = { "action": "edit", "title": page, - "token": token, "format": "json", "bot": True, "summary": summary, "text": content, + "token": token, } request = self.session.post(self.url, data=params, auth=self.auth) data = request.json() return data + def _get_template(self, schema_name): + with open(os.path.join("templates", f"{schema_name}.j2")) as f: + template = Template(f.read()) + return template + def load_files(self, schema_name): - files = sorted(os.listdir(schema_name)) + data_path = os.path.join("..", schema_name) + files = sorted(os.listdir(data_path)) + menu_template = self._get_template(f"{schema_name}_menu") + template = self._get_template(schema_name) + menu_entries = [] for filename in files: if filename.endswith(".json"): - filepath = os.path.join(schema_name, filename) + filepath = os.path.join(data_path, filename) f = open(filepath) - # Load and dump to validate that we have a json file data = json.loads(f.read()) + page_url = f"{schema_name}_{filename.split('.')[0]}" + content = template.render(data) + self.update_wiki(page_url, content, "Automatic update") print(f"Pushed {filename}") + menu_entries.append({"url": page_url, "data": data}) + + menu_content = menu_template.render(items=menu_entries) + self.update_wiki(schema_name, menu_content, "Automatic menu update") wiki = WikiApi() diff --git a/wiki/templates/buildings.j2 b/wiki/templates/buildings.j2 new file mode 100644 index 000000000..661a6364f --- /dev/null +++ b/wiki/templates/buildings.j2 @@ -0,0 +1,12 @@ +{{ building_name }} + +{{ description }} + +{% for level in levels %} +Level {{ level.level }} + +Build time {{ level.build_time }} + +Increased power {{ level.increased_power }} + +{% endfor %} diff --git a/wiki/templates/buildings_menu.j2 b/wiki/templates/buildings_menu.j2 new file mode 100644 index 000000000..5ddaa8f44 --- /dev/null +++ b/wiki/templates/buildings_menu.j2 @@ -0,0 +1,6 @@ +{% for item in items %} +[[{{ item.url }}|{{ item.data.building_name }}]] + +{{ item.data.description }} + +{% endfor %} \ No newline at end of file From f34d9f522a33f6659b02af41923fb08ef13ac35c Mon Sep 17 00:00:00 2001 From: David James Date: Sun, 1 Aug 2021 21:40:35 +1000 Subject: [PATCH 3/3] pre-commit fixes --- requirements.txt | 2 +- wiki/templates/buildings_menu.j2 | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/requirements.txt b/requirements.txt index 1c579e7d0..7f7afbf3b 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1 +1 @@ -jinja2 \ No newline at end of file +jinja2 diff --git a/wiki/templates/buildings_menu.j2 b/wiki/templates/buildings_menu.j2 index 5ddaa8f44..743b23026 100644 --- a/wiki/templates/buildings_menu.j2 +++ b/wiki/templates/buildings_menu.j2 @@ -3,4 +3,4 @@ {{ item.data.description }} -{% endfor %} \ No newline at end of file +{% endfor %}