Initial power level handling.
This commit is contained in:
parent
0da2e86bb9
commit
a6bafb79f2
1 changed files with 179 additions and 23 deletions
|
@ -357,6 +357,15 @@ class MatrixMessage:
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
class MatrixUser:
|
||||||
|
def __init__(self, name, display_name):
|
||||||
|
self.name = name # type: unicode
|
||||||
|
self.display_name = display_name # type: unicode
|
||||||
|
self.power_level = 0 # type: int
|
||||||
|
self.nick_color = "" # type: unicode
|
||||||
|
self.prefix = "" # type: unicode
|
||||||
|
|
||||||
|
|
||||||
class MatrixRoom:
|
class MatrixRoom:
|
||||||
def __init__(self, room_id):
|
def __init__(self, room_id):
|
||||||
# type: (unicode) -> None
|
# type: (unicode) -> None
|
||||||
|
@ -366,6 +375,7 @@ class MatrixRoom:
|
||||||
self.topic_author = "" # type: unicode
|
self.topic_author = "" # type: unicode
|
||||||
self.topic_date = None # type: datetime.datetime
|
self.topic_date = None # type: datetime.datetime
|
||||||
self.prev_batch = "" # type: unicode
|
self.prev_batch = "" # type: unicode
|
||||||
|
self.users = dict() # type: Dict[unicode, MatrixUser]
|
||||||
|
|
||||||
|
|
||||||
def key_from_value(dictionary, value):
|
def key_from_value(dictionary, value):
|
||||||
|
@ -410,6 +420,7 @@ class MatrixServer:
|
||||||
def __init__(self, name, config_file):
|
def __init__(self, name, config_file):
|
||||||
# type: (unicode, weechat.config) -> None
|
# type: (unicode, weechat.config) -> None
|
||||||
self.name = name # type: unicode
|
self.name = name # type: unicode
|
||||||
|
self.user_id = ""
|
||||||
self.address = "" # type: unicode
|
self.address = "" # type: unicode
|
||||||
self.port = 8448 # type: int
|
self.port = 8448 # type: int
|
||||||
self.options = dict() # type: Dict[unicode, weechat.config]
|
self.options = dict() # type: Dict[unicode, weechat.config]
|
||||||
|
@ -618,23 +629,50 @@ def matrix_handle_room_aliases(server, room_id, event):
|
||||||
def matrix_handle_room_members(server, room_id, event):
|
def matrix_handle_room_members(server, room_id, event):
|
||||||
# type: (MatrixServer, unicode, Dict[unicode, Any]) -> None
|
# type: (MatrixServer, unicode, Dict[unicode, Any]) -> None
|
||||||
buf = server.buffers[room_id]
|
buf = server.buffers[room_id]
|
||||||
|
room = server.rooms[room_id]
|
||||||
here = W.nicklist_search_group(buf, '', NICK_GROUP_HERE)
|
here = W.nicklist_search_group(buf, '', NICK_GROUP_HERE)
|
||||||
|
|
||||||
# TODO print out a informational message
|
# TODO print out a informational message
|
||||||
if event['membership'] == 'join':
|
if event['membership'] == 'join':
|
||||||
# TODO set the buffer type to a channel if we have more than 2 users
|
# TODO set the buffer type to a channel if we have more than 2 users
|
||||||
# TODO do we wan't to use the displayname here?
|
display_name = event['content']['displayname']
|
||||||
nick = event['content']['displayname']
|
full_name = event['sender']
|
||||||
nick_pointer = W.nicklist_search_nick(buf, "", nick)
|
short_name = strip_matrix_server(full_name)[1:]
|
||||||
|
|
||||||
|
user = MatrixUser(short_name, display_name)
|
||||||
|
|
||||||
|
if full_name == server.user_id:
|
||||||
|
user.nick_color = "weechat.color.chat_nick_self"
|
||||||
|
W.buffer_set(
|
||||||
|
buf,
|
||||||
|
"highlight_words",
|
||||||
|
",".join([full_name, user.name, user.display_name]))
|
||||||
|
else:
|
||||||
|
user.nick_color = W.info_get("nick_color_name", user.name)
|
||||||
|
|
||||||
|
room.users[full_name] = user
|
||||||
|
|
||||||
|
nick_pointer = W.nicklist_search_nick(buf, "", user.name)
|
||||||
if not nick_pointer:
|
if not nick_pointer:
|
||||||
W.nicklist_add_nick(buf, here, nick, "", "", "", 1)
|
W.nicklist_add_nick(
|
||||||
|
buf,
|
||||||
|
here,
|
||||||
|
user.display_name,
|
||||||
|
user.nick_color,
|
||||||
|
user.prefix,
|
||||||
|
"",
|
||||||
|
1
|
||||||
|
)
|
||||||
|
|
||||||
elif event['membership'] == 'leave':
|
elif event['membership'] == 'leave':
|
||||||
nick = event['content']['displayname']
|
full_name = event['sender']
|
||||||
nick_pointer = W.nicklist_search_nick(buf, "", nick)
|
user = room.users[full_name]
|
||||||
|
nick_pointer = W.nicklist_search_nick(buf, "", user.display_name)
|
||||||
if nick_pointer:
|
if nick_pointer:
|
||||||
W.nicklist_remove_nick(buf, nick_pointer)
|
W.nicklist_remove_nick(buf, nick_pointer)
|
||||||
|
|
||||||
|
del room.users[full_name]
|
||||||
|
|
||||||
|
|
||||||
def date_from_age(age):
|
def date_from_age(age):
|
||||||
# type: (float) -> int
|
# type: (float) -> int
|
||||||
|
@ -643,12 +681,29 @@ def date_from_age(age):
|
||||||
return date
|
return date
|
||||||
|
|
||||||
|
|
||||||
|
def color_for_tags(color):
|
||||||
|
if color == "weechat.color.chat_nick_self":
|
||||||
|
option = weechat.config_get(color)
|
||||||
|
return weechat.config_string(option)
|
||||||
|
return color
|
||||||
|
|
||||||
|
|
||||||
def matrix_handle_room_text_message(server, room_id, event, old=False):
|
def matrix_handle_room_text_message(server, room_id, event, old=False):
|
||||||
# type: (MatrixServer, unicode, Dict[unicode, Any], bool) -> None
|
# type: (MatrixServer, unicode, Dict[unicode, Any], bool) -> None
|
||||||
tag = ""
|
tag = ""
|
||||||
|
msg_author = ""
|
||||||
|
nick_color_name = ""
|
||||||
|
|
||||||
|
room = server.rooms[room_id]
|
||||||
msg = event['content']['body']
|
msg = event['content']['body']
|
||||||
|
|
||||||
|
if user in room.users:
|
||||||
|
user = room.users[event['sender']]
|
||||||
|
msg_author = user.display_name
|
||||||
|
nick_color_name = user.nick_color
|
||||||
|
else:
|
||||||
msg_author = strip_matrix_server(event['sender'])[1:]
|
msg_author = strip_matrix_server(event['sender'])[1:]
|
||||||
|
nick_color_name = W.info_get("nick_color_name", msg_author)
|
||||||
|
|
||||||
data = "{author}\t{msg}".format(author=msg_author, msg=msg)
|
data = "{author}\t{msg}".format(author=msg_author, msg=msg)
|
||||||
|
|
||||||
|
@ -657,15 +712,18 @@ def matrix_handle_room_text_message(server, room_id, event, old=False):
|
||||||
msg_date = date_from_age(event['unsigned']['age'])
|
msg_date = date_from_age(event['unsigned']['age'])
|
||||||
|
|
||||||
# TODO if this is an initial sync tag the messages as backlog
|
# TODO if this is an initial sync tag the messages as backlog
|
||||||
|
# TODO handle self messages from other devices
|
||||||
if old:
|
if old:
|
||||||
tag = ("nick_{a},matrix_id_{event_id},"
|
tag = ("nick_{a},prefix_nick_{color},matrix_id_{event_id},"
|
||||||
"matrix_message,notify_message,no_log,no_highlight").format(
|
"matrix_message,notify_message,no_log,no_highlight").format(
|
||||||
a=msg_author,
|
a=msg_author,
|
||||||
|
color=color_for_tags(nick_color_name),
|
||||||
event_id=event_id)
|
event_id=event_id)
|
||||||
else:
|
else:
|
||||||
tag = ("nick_{a},matrix_id_{event_id},"
|
tag = ("nick_{a},prefix_nick_{color},matrix_id_{event_id},"
|
||||||
"matrix_message,notify_message,log1").format(
|
"matrix_message,notify_message,log1").format(
|
||||||
a=msg_author,
|
a=msg_author,
|
||||||
|
color=color_for_tags(nick_color_name),
|
||||||
event_id=event_id)
|
event_id=event_id)
|
||||||
|
|
||||||
buf = server.buffers[room_id]
|
buf = server.buffers[room_id]
|
||||||
|
@ -675,12 +733,31 @@ def matrix_handle_room_text_message(server, room_id, event, old=False):
|
||||||
def matrix_handle_redacted_message(server, room_id, event):
|
def matrix_handle_redacted_message(server, room_id, event):
|
||||||
# type: (MatrixServer, unicode, Dict[Any, Any]) -> None
|
# type: (MatrixServer, unicode, Dict[Any, Any]) -> None
|
||||||
reason = ""
|
reason = ""
|
||||||
|
room = server.rooms[room_id]
|
||||||
|
|
||||||
# TODO check if the message is already printed out, in that case we got the
|
# TODO check if the message is already printed out, in that case we got the
|
||||||
# message a second time and a redaction event will take care of it.
|
# message a second time and a redaction event will take care of it.
|
||||||
censor = strip_matrix_server(
|
censor = event['unsigned']['redacted_because']['sender']
|
||||||
event['unsigned']['redacted_because']['sender']
|
nick_color_name = ""
|
||||||
)[1:]
|
|
||||||
|
if censor in room.users:
|
||||||
|
user = room.users[censor]
|
||||||
|
nick_color_name = user.nick_color
|
||||||
|
censor = ("{nick_color}{nick}{ncolor} {del_color}"
|
||||||
|
"({host_color}{full_name}{ncolor}{del_color})").format(
|
||||||
|
nick_color=W.color(nick_color_name),
|
||||||
|
nick=user.display_name,
|
||||||
|
ncolor=W.color("reset"),
|
||||||
|
del_color=W.color("chat_delimiters"),
|
||||||
|
host_color=W.color("chat_host"),
|
||||||
|
full_name=censor)
|
||||||
|
else:
|
||||||
|
censor = strip_matrix_server(censor)[1:]
|
||||||
|
nick_color_name = W.info_get("nick_color_name", censor)
|
||||||
|
censor = "{color}{censor}{ncolor}".format(
|
||||||
|
color=W.color(nick_color_name),
|
||||||
|
censor=censor,
|
||||||
|
ncolor=W.color("reset"))
|
||||||
|
|
||||||
if 'reason' in event['unsigned']['redacted_because']['content']:
|
if 'reason' in event['unsigned']['redacted_because']['content']:
|
||||||
reason = ", reason: \"{reason}\"".format(
|
reason = ", reason: \"{reason}\"".format(
|
||||||
|
@ -702,8 +779,12 @@ def matrix_handle_redacted_message(server, room_id, event):
|
||||||
|
|
||||||
msg_date = date_from_age(event['unsigned']['age'])
|
msg_date = date_from_age(event['unsigned']['age'])
|
||||||
|
|
||||||
tag = ("nick_{a},matrix_id_{event_id},matrix_message,matrix_redacted,"
|
tag = ("nick_{a},prefix_nick_{color},matrix_id_{event_id},"
|
||||||
"notify_message").format(a=msg_author, event_id=event_id)
|
"matrix_message,matrix_redacted,"
|
||||||
|
"notify_message,no_highlight").format(
|
||||||
|
a=msg_author,
|
||||||
|
color=color_for_tags(nick_color_name),
|
||||||
|
event_id=event_id)
|
||||||
|
|
||||||
buf = server.buffers[room_id]
|
buf = server.buffers[room_id]
|
||||||
W.prnt_date_tags(buf, msg_date, tag, data)
|
W.prnt_date_tags(buf, msg_date, tag, data)
|
||||||
|
@ -783,7 +864,6 @@ def matrix_handle_room_redaction(server, room_id, event):
|
||||||
|
|
||||||
if own_lines:
|
if own_lines:
|
||||||
hdata_line = W.hdata_get('line')
|
hdata_line = W.hdata_get('line')
|
||||||
hdata_line_data = W.hdata_get('line_data')
|
|
||||||
|
|
||||||
line = W.hdata_pointer(
|
line = W.hdata_pointer(
|
||||||
W.hdata_get('lines'),
|
W.hdata_get('lines'),
|
||||||
|
@ -811,6 +891,55 @@ def matrix_handle_room_redaction(server, room_id, event):
|
||||||
return W.WEECHAT_RC_OK
|
return W.WEECHAT_RC_OK
|
||||||
|
|
||||||
|
|
||||||
|
def get_prefix_for_level(level):
|
||||||
|
# type: (int) -> unicode
|
||||||
|
if level >= 100:
|
||||||
|
return "&"
|
||||||
|
elif level >= 50:
|
||||||
|
return "@"
|
||||||
|
elif level > 0:
|
||||||
|
return "+"
|
||||||
|
return ""
|
||||||
|
|
||||||
|
|
||||||
|
def get_prefix_color(prefix):
|
||||||
|
# type: (unicode) -> unicode
|
||||||
|
if prefix == "&":
|
||||||
|
return "lightgreen"
|
||||||
|
elif prefix == "@":
|
||||||
|
return "lightgreen"
|
||||||
|
elif prefix == "+":
|
||||||
|
return "yellow"
|
||||||
|
return ""
|
||||||
|
|
||||||
|
|
||||||
|
def update_nicklist_nick(buf, user, nick):
|
||||||
|
# type: (weechat.buffer, MatrixUser, weechat.nick) -> None
|
||||||
|
W.nicklist_nick_set(buf, nick, "prefix", user.prefix)
|
||||||
|
W.nicklist_nick_set(buf, nick, "prefix_color",
|
||||||
|
get_prefix_color(user.prefix))
|
||||||
|
|
||||||
|
|
||||||
|
def matrix_handle_room_power_levels(server, room_id, event):
|
||||||
|
if not event['content']['users']:
|
||||||
|
return
|
||||||
|
|
||||||
|
buf = server.buffers[room_id]
|
||||||
|
room = server.rooms[room_id]
|
||||||
|
|
||||||
|
for full_name, level in event['content']['users'].items():
|
||||||
|
if full_name not in room.users:
|
||||||
|
continue
|
||||||
|
|
||||||
|
user = room.users[full_name]
|
||||||
|
user.power_level = level
|
||||||
|
user.prefix = get_prefix_for_level(level)
|
||||||
|
|
||||||
|
W.nicklist_remove_nick(buf, user.name)
|
||||||
|
nick = W.nicklist_search_nick(buf, "", user.name)
|
||||||
|
update_nicklist_nick(buf, user, nick)
|
||||||
|
|
||||||
|
|
||||||
def matrix_handle_room_events(server, room_id, room_events):
|
def matrix_handle_room_events(server, room_id, room_events):
|
||||||
# type: (MatrixServer, unicode, Dict[Any, Any]) -> None
|
# type: (MatrixServer, unicode, Dict[Any, Any]) -> None
|
||||||
for event in room_events:
|
for event in room_events:
|
||||||
|
@ -841,17 +970,33 @@ def matrix_handle_room_events(server, room_id, room_events):
|
||||||
|
|
||||||
W.buffer_set(buf, "title", topic)
|
W.buffer_set(buf, "title", topic)
|
||||||
|
|
||||||
|
nick_color = W.info_get("nick_color_name", room.topic_author)
|
||||||
|
author = room.topic_author
|
||||||
|
|
||||||
|
if author in room.users:
|
||||||
|
user = room.users[author]
|
||||||
|
nick_color = user.nick_color
|
||||||
|
author = user.display_name
|
||||||
|
|
||||||
|
author = ("{nick_color}{user}{ncolor}").format(
|
||||||
|
nick_color=W.color(nick_color),
|
||||||
|
user=author,
|
||||||
|
ncolor=W.color("reset"))
|
||||||
|
|
||||||
# TODO nick and topic color
|
# TODO nick and topic color
|
||||||
# TODO print old topic if configured so
|
# TODO print old topic if configured so
|
||||||
# TODO nick display name if configured so and found
|
# TODO nick display name if configured so and found
|
||||||
message = ("{prefix}{nick} has changed the topic for {room} to "
|
message = ("{prefix}{nick} has changed "
|
||||||
"\"{topic}\"").format(
|
"the topic for {chan_color}{room}{ncolor} "
|
||||||
|
"to \"{topic}\"").format(
|
||||||
prefix=W.prefix("network"),
|
prefix=W.prefix("network"),
|
||||||
nick=room.topic_author,
|
nick=author,
|
||||||
room=room.alias,
|
chan_color=W.color("chat_channel"),
|
||||||
|
ncolor=W.color("reset"),
|
||||||
|
room=strip_matrix_server(room.alias),
|
||||||
topic=topic)
|
topic=topic)
|
||||||
|
|
||||||
tags = "matrix_topic,log3,matrix_id_{event_id}".format(
|
tags = "matrix_topic,no_highlight,log3,matrix_id_{event_id}".format(
|
||||||
event_id=event['event_id'])
|
event_id=event['event_id'])
|
||||||
|
|
||||||
date = date_from_age(topic_age)
|
date = date_from_age(topic_age)
|
||||||
|
@ -861,6 +1006,9 @@ def matrix_handle_room_events(server, room_id, room_events):
|
||||||
elif event['type'] == "m.room.redaction":
|
elif event['type'] == "m.room.redaction":
|
||||||
matrix_handle_room_redaction(server, room_id, event)
|
matrix_handle_room_redaction(server, room_id, event)
|
||||||
|
|
||||||
|
elif event["type"] == "m.room.power_levels":
|
||||||
|
matrix_handle_room_power_levels(server, room_id, event)
|
||||||
|
|
||||||
else:
|
else:
|
||||||
message = ("{prefix}Handling of room event type "
|
message = ("{prefix}Handling of room event type "
|
||||||
"{type} not implemented").format(
|
"{type} not implemented").format(
|
||||||
|
@ -977,6 +1125,7 @@ def matrix_handle_message(
|
||||||
|
|
||||||
if message_type is MessageType.LOGIN:
|
if message_type is MessageType.LOGIN:
|
||||||
server.access_token = response["access_token"]
|
server.access_token = response["access_token"]
|
||||||
|
server.user_id = response["user_id"]
|
||||||
message = MatrixMessage(server, MessageType.SYNC)
|
message = MatrixMessage(server, MessageType.SYNC)
|
||||||
send_or_queue(server, message)
|
send_or_queue(server, message)
|
||||||
|
|
||||||
|
@ -1003,8 +1152,12 @@ def matrix_handle_message(
|
||||||
# so ignore it in the sync.
|
# so ignore it in the sync.
|
||||||
server.ignore_event_list.append(event_id)
|
server.ignore_event_list.append(event_id)
|
||||||
|
|
||||||
tag = "nick_{a},matrix_id_{event_id},matrix_message".format(
|
tag = ("notify_none,no_highlight,self_msg,log1,nick_{a},"
|
||||||
a=author, event_id=event_id)
|
"prefix_nick_{color},matrix_id_{event_id},"
|
||||||
|
"matrix_message").format(
|
||||||
|
a=author,
|
||||||
|
color=color_for_tags(weechat.color.chat_nick_self),
|
||||||
|
event_id=event_id)
|
||||||
|
|
||||||
data = "{author}\t{msg}".format(author=author, msg=message)
|
data = "{author}\t{msg}".format(author=author, msg=message)
|
||||||
|
|
||||||
|
@ -2189,6 +2342,9 @@ def matrix_command_buf_clear_cb(data, buffer, command):
|
||||||
|
|
||||||
@utf8_decode
|
@utf8_decode
|
||||||
def matrix_command_pgup_cb(data, buffer, command):
|
def matrix_command_pgup_cb(data, buffer, command):
|
||||||
|
# TODO the highlight status isn't allowed to be updated/changed via hdata,
|
||||||
|
# therefore the highlight status of a messages can't be reoredered this
|
||||||
|
# would need to be fixed in weechat
|
||||||
# TODO we shouldn't fetch and print out more messages than
|
# TODO we shouldn't fetch and print out more messages than
|
||||||
# max_buffer_lines_number or older messages than max_buffer_lines_minutes
|
# max_buffer_lines_number or older messages than max_buffer_lines_minutes
|
||||||
for server in SERVERS.values():
|
for server in SERVERS.values():
|
||||||
|
@ -2208,7 +2364,7 @@ def matrix_command_pgup_cb(data, buffer, command):
|
||||||
return W.WEECHAT_RC_OK
|
return W.WEECHAT_RC_OK
|
||||||
|
|
||||||
|
|
||||||
def tags_from_line_data(line_data, ):
|
def tags_from_line_data(line_data):
|
||||||
# type: (weechat.hdata) -> List[unicode]
|
# type: (weechat.hdata) -> List[unicode]
|
||||||
tags_count = W.hdata_get_var_array_size(
|
tags_count = W.hdata_get_var_array_size(
|
||||||
W.hdata_get('line_data'),
|
W.hdata_get('line_data'),
|
||||||
|
|
Loading…
Add table
Reference in a new issue