aboutsummaryrefslogtreecommitdiff
path: root/app/tasks
diff options
context:
space:
mode:
Diffstat (limited to 'app/tasks')
-rw-r--r--app/tasks/__init__.py2
-rw-r--r--app/tasks/forumtasks.py33
-rw-r--r--app/tasks/phpbbparser.py72
3 files changed, 106 insertions, 1 deletions
diff --git a/app/tasks/__init__.py b/app/tasks/__init__.py
index c431fae..9ee293e 100644
--- a/app/tasks/__init__.py
+++ b/app/tasks/__init__.py
@@ -41,4 +41,4 @@ def make_celery(app):
celery = make_celery(app)
-from . import importtasks
+from . import importtasks, forumtasks
diff --git a/app/tasks/forumtasks.py b/app/tasks/forumtasks.py
new file mode 100644
index 0000000..e4ddc59
--- /dev/null
+++ b/app/tasks/forumtasks.py
@@ -0,0 +1,33 @@
+import flask
+from flask.ext.sqlalchemy import SQLAlchemy
+from app import app
+from app.models import *
+from app.tasks import celery
+from .phpbbparser import getProfile
+
+@celery.task()
+def checkForumAccount(username, token=None):
+ try:
+ profile = getProfile("https://forum.minetest.net", username)
+ except OSError:
+ return
+
+ user = User.query.filter_by(forums_username=username).first()
+
+ # Create user
+ needsSaving = False
+ if user is None:
+ user = User(username)
+ user.forums_username = username
+ db.session.add(user)
+
+ # Get github username
+ github_username = profile.get("github")
+ if github_username is not None and github_username.strip() != "":
+ print("Updated github username")
+ user.github_username = github_username
+ needsSaving = True
+
+ # Save
+ if needsSaving:
+ db.session.commit()
diff --git a/app/tasks/phpbbparser.py b/app/tasks/phpbbparser.py
new file mode 100644
index 0000000..3932b94
--- /dev/null
+++ b/app/tasks/phpbbparser.py
@@ -0,0 +1,72 @@
+import urllib, socket
+from bs4 import *
+from urllib.parse import urljoin
+import urllib.request
+import os.path
+import time
+
+class Profile:
+ def __init__(self, username):
+ self.username = username
+ self.signature = ""
+ self.properties = {}
+
+ def set(self, key, value):
+ self.properties[key] = value
+
+ def get(self, key):
+ return self.properties[key] if key in self.properties else None
+
+ def __str__(self):
+ return self.username + "\n" + str(self.signature) + "\n" + str(self.properties)
+
+def __extract_properties(profile, soup):
+ el = soup.find(id="viewprofile")
+ if el is None:
+ return None
+
+ res = el.find_all("dl", class_ = "left-box details")
+ if len(res) != 1:
+ return None
+
+ catch_next_key = None
+
+ # Look through
+ for element in res[0].children:
+ if element.name == "dt":
+ if catch_next_key is None:
+ catch_next_key = element.text.lower()[:-1].strip()
+ else:
+ print("Unexpected dt!")
+
+ elif element.name == "dd":
+ if catch_next_key is None:
+ print("Unexpected dd!")
+ else:
+ if catch_next_key != "groups":
+ profile.set(catch_next_key, element.text)
+ catch_next_key = None
+
+ elif element and element.name is not None:
+ print("Unexpected other")
+
+def __extract_signature(soup):
+ res = soup.find_all("div", class_="signature")
+ if (len(res) != 1):
+ return None
+ else:
+ return res[0]
+
+def getProfile(url, username):
+ url = url + "/memberlist.php?mode=viewprofile&un=" + username
+
+ contents = urllib.request.urlopen(url).read().decode("utf-8")
+ soup = BeautifulSoup(contents, "lxml")
+ if soup is None:
+ return None
+ else:
+ profile = Profile(username)
+ profile.signature = __extract_signature(soup)
+ __extract_properties(profile, soup)
+
+ return profile