Refactor some && officially integrate Messenger backend :)
This commit is contained in:
parent
f251d67c32
commit
1d8b7ef84a
3 changed files with 60 additions and 50 deletions
6
connector/external/config.go
vendored
6
connector/external/config.go
vendored
|
@ -45,6 +45,12 @@ func init() {
|
||||||
IsPassword: true,
|
IsPassword: true,
|
||||||
Required: true,
|
Required: true,
|
||||||
},
|
},
|
||||||
|
&ConfigEntry{
|
||||||
|
Name: "initial_backlog",
|
||||||
|
Description: "Maximum number of messages to load when joining a channel",
|
||||||
|
IsNumeric: true,
|
||||||
|
Default: "100",
|
||||||
|
},
|
||||||
},
|
},
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
97
external/messenger.py
vendored
97
external/messenger.py
vendored
|
@ -107,60 +107,31 @@ class InitialSyncThread(threading.Thread):
|
||||||
"room": thread.uid,
|
"room": thread.uid,
|
||||||
})
|
})
|
||||||
|
|
||||||
self.send_room_info(thread, members)
|
self.bridge.send_room_info(thread, members)
|
||||||
self.send_room_members(thread, members)
|
self.bridge.send_room_members(thread, members)
|
||||||
|
|
||||||
self.backlog_room(thread)
|
self.backlog_room(thread)
|
||||||
|
|
||||||
|
|
||||||
def send_room_info(self, thread, members):
|
|
||||||
room_info = {}
|
|
||||||
if thread.name is not None:
|
|
||||||
room_info["name"] = thread.name
|
|
||||||
else:
|
|
||||||
who = [m for m in members if m.uid != self.client.uid]
|
|
||||||
if len(who) > 3:
|
|
||||||
room_info["name"] = ", ".join([self.bridge.getUserShortName(m) for m in who[:3]] + ["..."])
|
|
||||||
else:
|
|
||||||
room_info["name"] = ", ".join([self.bridge.getUserShortName(m) for m in who])
|
|
||||||
|
|
||||||
if thread.photo is not None:
|
|
||||||
room_info["picture"] = mediaObjectOfURL(thread.photo)
|
|
||||||
else:
|
|
||||||
for m in members:
|
|
||||||
if m.uid != self.client.uid and m.photo is not None:
|
|
||||||
room_info["picture"] = mediaObjectOfURL(m.photo)
|
|
||||||
break
|
|
||||||
|
|
||||||
self.bridge.write({
|
|
||||||
"_type": ROOM_INFO_UPDATED,
|
|
||||||
"room": thread.uid,
|
|
||||||
"data": room_info,
|
|
||||||
})
|
|
||||||
|
|
||||||
def send_room_members(self, thread, members):
|
|
||||||
for member in members:
|
|
||||||
sys.stderr.write("fb thread member: {}\n".format(member))
|
|
||||||
self.bridge.ensureJoined(self.bridge.getUserId(member), thread.uid)
|
|
||||||
|
|
||||||
def backlog_room(self, thread):
|
def backlog_room(self, thread):
|
||||||
prev_last_seen = self.bridge.cache_get("last_seen_%s"%thread.uid)
|
prev_last_seen = self.bridge.cache_get("last_seen_%s"%thread.uid)
|
||||||
if prev_last_seen == "":
|
if prev_last_seen == "":
|
||||||
messages = self.client.fetchThreadMessages(thread.uid, limit=100)
|
prev_last_seen = None
|
||||||
else:
|
|
||||||
messages = []
|
messages = []
|
||||||
found = False
|
found = False
|
||||||
while not found:
|
while not found:
|
||||||
before = None
|
before = None
|
||||||
if len(messages) > 0:
|
if len(messages) > 0:
|
||||||
before = messages[-1].timestamp
|
before = messages[-1].timestamp
|
||||||
page = self.client.fetchThreadMessages(thread.uid, before=before, limit=20)
|
page = self.client.fetchThreadMessages(thread.uid, before=before, limit=20)
|
||||||
for m in page:
|
for m in page:
|
||||||
if m.uid == prev_last_seen:
|
if m.uid == prev_last_seen or len(messages) > self.bridge.init_backlog_length:
|
||||||
found = True
|
found = True
|
||||||
break
|
break
|
||||||
else:
|
else:
|
||||||
messages.append(m)
|
messages.append(m)
|
||||||
|
|
||||||
for m in reversed(messages):
|
for m in reversed(messages):
|
||||||
if m.text is None:
|
if m.text is None:
|
||||||
m.text = ""
|
m.text = ""
|
||||||
|
@ -189,6 +160,7 @@ class MessengerBridge:
|
||||||
self.rev_uid = {}
|
self.rev_uid = {}
|
||||||
self.uid_map = {}
|
self.uid_map = {}
|
||||||
self.joined_map = {}
|
self.joined_map = {}
|
||||||
|
self.init_backlog_length = 100
|
||||||
|
|
||||||
def getUserId(self, user):
|
def getUserId(self, user):
|
||||||
retval = None
|
retval = None
|
||||||
|
@ -276,6 +248,7 @@ class MessengerBridge:
|
||||||
def handle_cmd(self, cmd):
|
def handle_cmd(self, cmd):
|
||||||
ty = cmd["_type"]
|
ty = cmd["_type"]
|
||||||
if ty == CONFIGURE:
|
if ty == CONFIGURE:
|
||||||
|
self.init_backlog_length = int(cmd["data"]["initial_backlog"])
|
||||||
client_file = "/tmp/fbclient_" + hashlib.sha224(cmd["data"]["email"].encode("utf-8")).hexdigest()
|
client_file = "/tmp/fbclient_" + hashlib.sha224(cmd["data"]["email"].encode("utf-8")).hexdigest()
|
||||||
|
|
||||||
try:
|
try:
|
||||||
|
@ -378,6 +351,36 @@ class MessengerBridge:
|
||||||
def cache_put(self, key, value):
|
def cache_put(self, key, value):
|
||||||
self.write({"_type": CACHE_PUT, "key": key, "value": value})
|
self.write({"_type": CACHE_PUT, "key": key, "value": value})
|
||||||
|
|
||||||
|
def send_room_info(self, thread, members):
|
||||||
|
room_info = {}
|
||||||
|
if thread.name is not None:
|
||||||
|
room_info["name"] = thread.name
|
||||||
|
else:
|
||||||
|
who = [m for m in members if m.uid != self.client.uid]
|
||||||
|
if len(who) > 3:
|
||||||
|
room_info["name"] = ", ".join([self.getUserShortName(m) for m in who[:3]] + ["..."])
|
||||||
|
else:
|
||||||
|
room_info["name"] = ", ".join([self.getUserShortName(m) for m in who])
|
||||||
|
|
||||||
|
if thread.photo is not None:
|
||||||
|
room_info["picture"] = mediaObjectOfURL(thread.photo)
|
||||||
|
else:
|
||||||
|
for m in members:
|
||||||
|
if m.uid != self.client.uid and m.photo is not None:
|
||||||
|
room_info["picture"] = mediaObjectOfURL(m.photo)
|
||||||
|
break
|
||||||
|
|
||||||
|
self.write({
|
||||||
|
"_type": ROOM_INFO_UPDATED,
|
||||||
|
"room": thread.uid,
|
||||||
|
"data": room_info,
|
||||||
|
})
|
||||||
|
|
||||||
|
def send_room_members(self, thread, members):
|
||||||
|
for member in members:
|
||||||
|
sys.stderr.write("fb thread member: {}\n".format(member))
|
||||||
|
self.ensureJoined(self.getUserId(member), thread.uid)
|
||||||
|
|
||||||
def ensureJoined(self, userId, room):
|
def ensureJoined(self, userId, room):
|
||||||
key = "{}--{}".format(userId, room)
|
key = "{}--{}".format(userId, room)
|
||||||
if not key in self.joined_map:
|
if not key in self.joined_map:
|
||||||
|
|
|
@ -34,8 +34,9 @@
|
||||||
|
|
||||||
<h5 class="mt-4">Add account</h5>
|
<h5 class="mt-4">Add account</h5>
|
||||||
|
|
||||||
<a class="btn btn-sm btn-dark" href="/add/IRC">IRC</a>
|
<a class="btn btn-sm btn-primary mr-4" href="/add/Mattermost">Mattermost</a>
|
||||||
<a class="btn btn-sm btn-warning ml-4" href="/add/XMPP">XMPP</a>
|
<a class="btn btn-sm btn-warning mr-4" href="/add/XMPP">XMPP</a>
|
||||||
<a class="btn btn-sm btn-info ml-4" href="/add/Mattermost">Mattermost</a>
|
<a class="btn btn-sm btn-dark mr-4" href="/add/IRC">IRC</a>
|
||||||
|
<a class="btn btn-sm btn-primary mr-4" href="/add/Messenger">Facebook Messenger</a>
|
||||||
|
|
||||||
{{end}}
|
{{end}}
|
||||||
|
|
Loading…
Reference in a new issue