diff options
Diffstat (limited to 'external')
-rwxr-xr-x | external/messenger.py | 85 |
1 files changed, 84 insertions, 1 deletions
diff --git a/external/messenger.py b/external/messenger.py index 495bca9..8403a03 100755 --- a/external/messenger.py +++ b/external/messenger.py @@ -2,10 +2,13 @@ import sys import json +import signal +import threading import hashlib -import gevent + import fbchat +from fbchat.models import * # ---- MESSAGE TYPES ---- @@ -35,21 +38,96 @@ CACHE_GET = "cache_get" REP_OK = "rep_ok" REP_ERROR = "rep_error" +# Event types +EVENT_JOIN = "join" +EVENT_LEAVE = "leave" +EVENT_MESSAGE = "message" +EVENT_ACTION = "action" + # ---- MESSENGER CLIENT CLASS THAT HANDLES EVENTS ---- +def getUserId(user): + if user.url is not None and not "?" in user.url: + return user.url.split("/")[-1] + else: + return user.uid + +def mediaObjectOfURL(url): + return { + "filename": url.split("?")[0].split("/")[-1], + "url": url, + } + + class MessengerBridgeClient(fbchat.Client): def __init__(self, bridge, *args, **kwargs): self.bridge = bridge super(MessengerBridgeClient, self).__init__(*args, **kwargs) +class InitialSyncThread(threading.Thread): + def __init__(self, client, bridge, *args, **kwargs): + super(InitialSyncThread, self).__init__(*args, **kwargs) + + self.client = client + self.bridge = bridge + + def run(self): + threads = self.client.fetchThreadList() + sys.stderr.write("fb thread list: {}\n".format(threads)) + for thread in threads: + sys.stderr.write("fb thread: {}\n".format(thread)) + if thread.type != ThreadType.GROUP: + continue + self.bridge.write({ + "_type": JOINED, + "room": thread.uid, + }) + + room_info = { + "name": thread.name, + } + if thread.photo is not None: + room_info["picture"] = mediaObjectOfURL(thread.photo) + self.bridge.write({ + "_type": ROOM_INFO_UPDATED, + "room": thread.uid, + "data": room_info, + }) + + members = self.client.fetchAllUsersFromThreads([thread]) + for member in members: + sys.stderr.write("fb thread member: {}\n".format(member)) + self.bridge.write({ + "_type": EVENT, + "data": { + "type": EVENT_JOIN, + "author": getUserId(member), + "room": thread.uid, + } + }) + + user_info = { + "display_name": member.name, + } + if member.photo is not None: + user_info["avatar"] = mediaObjectOfURL(member.photo) + self.bridge.write({ + "_type": USER_INFO_UPDATED, + "user": getUserId(member), + "data": user_info, + }) + # TODO: handle events # ---- MAIN LOOP THAT HANDLES REQUESTS FROM BRIDGE ---- class MessengerBridge: + def __init__(self): + pass + def run(self): self.client = None self.keep_running = True @@ -104,10 +182,15 @@ class MessengerBridge: except: pass + InitialSyncThread(self.client, self).start() + elif ty == CLOSE: self.client.logout() self.keep_running = False + elif ty == GET_USER: + return {"_type": REP_OK, "user": self.client.uid} + else: return {"_type": REP_ERROR, "error": "Not implemented"} |