aboutsummaryrefslogtreecommitdiff
path: root/external
diff options
context:
space:
mode:
Diffstat (limited to 'external')
-rwxr-xr-xexternal/messenger.py29
1 files changed, 20 insertions, 9 deletions
diff --git a/external/messenger.py b/external/messenger.py
index 9874b5b..6da4808 100755
--- a/external/messenger.py
+++ b/external/messenger.py
@@ -1,8 +1,6 @@
#!/usr/bin/env python3
-# @FIXME: make revUserId work correctly (e.g.: talking to a contact not in your top 20 recent threads will fail) - could we do this with a search request?
# @FIXME: store the client pickle in the config automatically
-# @FIXME: add a way to search for users and initiate a discussion
import sys
import json
@@ -31,6 +29,7 @@ SET_ROOM_INFO = "set_room_info"
JOIN = "join"
INVITE = "invite"
LEAVE = "leave"
+SEARCH = "search"
SEND = "send"
CLOSE = "close"
@@ -47,6 +46,7 @@ CACHE_GET = "cache_get"
# ezbr -> external: all must wait for a reply!
# external -> ezbr: only CACHE_GET produces a reply
REP_OK = "rep_ok"
+REP_SEARCH_RESULTS = "rep_search_results"
REP_ERROR = "rep_error"
# Event types
@@ -168,13 +168,14 @@ class MessengerBridge:
return self.getUserId(user)
def revUserId(self, user_id):
- if user_id in self.rev_uid:
- return self.rev_uid[user_id]
- else:
- # TODO this doesn't work always...
- # we should try to find the api endpoint that resolves usernames ?
- # or do a search request and try to find a user that has that username
- return user_id
+ if user_id not in self.rev_uid:
+ for user in self.client.searchForUsers(user_id):
+ self.getUserId(user)
+
+ if user_id not in self.rev_uid:
+ raise ValueError("User not found: {}".format(user_id))
+
+ return self.rev_uid[user_id]
def getUserShortName(self, user):
if user.first_name != None:
@@ -277,6 +278,16 @@ class MessengerBridge:
uid = self.revUserId(cmd["user"])
self.client.addUsersToGroup([uid], cmd["room"])
+ elif ty == SEARCH:
+ users = self.client.searchForUsers(cmd["data"])
+ rep = []
+ for user in users:
+ rep.append({
+ "id": self.getUserId(user),
+ "display_name": user.name,
+ })
+ return {"_type": REP_SEARCH_RESULTS, "data": rep}
+
elif ty == SEND:
event = cmd["data"]
if event["type"] in [EVENT_MESSAGE, EVENT_ACTION]: