Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions requirements.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
jinja2
100 changes: 100 additions & 0 deletions wiki/push-to-wiki.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,100 @@
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_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"))

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
self.login()
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,
"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):
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(data_path, filename)
f = open(filepath)

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()

wiki.load_files("buildings")
12 changes: 12 additions & 0 deletions wiki/templates/buildings.j2
Original file line number Diff line number Diff line change
@@ -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 %}
6 changes: 6 additions & 0 deletions wiki/templates/buildings_menu.j2
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
{% for item in items %}
[[{{ item.url }}|{{ item.data.building_name }}]]

{{ item.data.description }}

{% endfor %}