diff options
Diffstat (limited to 'app/tasks')
-rw-r--r-- | app/tasks/__init__.py | 2 | ||||
-rw-r--r-- | app/tasks/forumtasks.py | 33 | ||||
-rw-r--r-- | app/tasks/phpbbparser.py | 72 |
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 |