def matrix_bar_item_name(data, item, window, buffer, extra_info): # pylint: disable=unused-argument for server in SERVERS.values(): if buffer in server.buffers.values(): color = ("status_name_ssl" if server.ssl_context.check_hostname else "status_name") room_id = key_from_value(server.buffers, buffer) room = server.rooms[room_id] return "{color}{name}".format( color=W.color(color), name=room.display_name(server.user_id)) elif buffer == server.server_buffer: color = ("status_name_ssl" if server.ssl_context.check_hostname else "status_name") return "{color}server{del_color}[{color}{name}{del_color}]".format( color=W.color(color), del_color=W.color("bar_delim"), name=server.name) return ""
def execute(self, server, room, buff, tags): nick, color_name = sender_to_nick_and_color(room, self.sender) color = color_for_tags(color_name) date = server_ts_to_weechat(self.timestamp) event_tags = add_event_tags(self.event_id, nick, color, tags) reason = (", reason: \"{reason}\"".format( reason=self.reason) if self.reason else "") censor, _ = sender_to_nick_and_color(room, self.censor) msg = ("{del_color}<{log_color}Message redacted by: " "{censor}{log_color}{reason}{del_color}>{ncolor}").format( del_color=W.color("chat_delimiters"), ncolor=W.color("reset"), log_color=W.color("logger.color.backlog_line"), censor=censor, reason=reason) event_tags.append("matrix_redacted") tags_string = ",".join(event_tags) data = "{author}\t{msg}".format(author=nick, msg=msg) W.prnt_date_tags(buff, date, tags_string, data)
def matrix_server_command_delete(args): for server_name in args: if check_server_existence(server_name, SERVERS): server = SERVERS[server_name] if server.connected: message = ("{prefix}matrix: you can not delete server " "{color}{server}{ncolor} because you are " "connected to it. Try \"/matrix disconnect " "{color}{server}{ncolor}\" before.").format( prefix=W.prefix("error"), color=W.color("chat_server"), ncolor=W.color("reset"), server=server.name) W.prnt("", message) return for buf in server.buffers.values(): W.buffer_close(buf) if server.server_buffer: W.buffer_close(server.server_buffer) for option in server.options.values(): W.config_option_free(option) message = ("matrix: server {color}{server}{ncolor} has been " "deleted").format(server=server.name, color=W.color("chat_server"), ncolor=W.color("reset")) del SERVERS[server.name] server = None W.prnt("", message)
def _redact_line(self, data_pointer, tags, room, buff): hdata_line_data = W.hdata_get('line_data') message = W.hdata_string(hdata_line_data, data_pointer, 'message') censor, _ = sender_to_nick_and_color(room, self.sender) reason = ("" if not self.reason else ", reason: \"{reason}\"".format( reason=self.reason)) redaction_msg = ("{del_color}<{log_color}Message redacted by: " "{censor}{log_color}{reason}{del_color}>" "{ncolor}").format( del_color=W.color("chat_delimiters"), ncolor=W.color("reset"), log_color=W.color("logger.color.backlog_line"), censor=censor, reason=reason) new_message = "" if OPTIONS.redaction_type == RedactType.STRIKETHROUGH: plaintext_msg = W.string_remove_color(message, '') new_message = string_strikethrough(plaintext_msg) elif OPTIONS.redaction_type == RedactType.NOTICE: new_message = message elif OPTIONS.redaction_type == RedactType.DELETE: pass message = " ".join(s for s in [new_message, redaction_msg] if s) tags.append("matrix_redacted") new_data = {'tags_array': ','.join(tags), 'message': message} W.hdata_update(hdata_line_data, data_pointer, new_data)
def execute(self, server, room, buff, tags): topic = self.topic nick, color_name = sender_to_nick_and_color(room, self.sender) author = ("{nick_color}{user}{ncolor}").format( nick_color=W.color(color_name), user=nick, ncolor=W.color("reset")) # TODO print old topic if configured so if room.is_named(): message = ("{prefix}{nick} has changed " "the topic for {chan_color}{room}{ncolor} " "to \"{topic}\"").format( prefix=W.prefix("network"), nick=author, chan_color=W.color("chat_channel"), ncolor=W.color("reset"), room=room.named_room_name(), topic=topic) else: message = ('{prefix}{nick} has changed the topic to ' '"{topic}"').format(prefix=W.prefix("network"), nick=author, topic=topic) tags = ["matrix_topic", "log3", "matrix_id_{}".format(self.event_id)] date = server_ts_to_weechat(self.timestamp) W.prnt_date_tags(buff, date, ",".join(tags), message)
def execute(self, server, room, buff, tags): msg = "{color}{message}{ncolor}".format( color=W.color("irc.color.notice"), message=self.message, ncolor=W.color("reset")) self._print_message(msg, room, buff, tags)
def matrix_bar_item_plugin(data, item, window, buffer, extra_info): # pylint: disable=unused-argument for server in SERVERS.values(): if (buffer in server.buffers.values() or buffer == server.server_buffer): return "matrix{color}/{color_fg}{name}".format( color=W.color("bar_delim"), color_fg=W.color("bar_fg"), name=server.name) return ""
def get_value_string(value, default_value): if value == default_value: if not value: value = "''" value_string = " ({value})".format(value=value) else: value_string = "{color}{value}{ncolor}".format( color=W.color("chat_value"), value=value, ncolor=W.color("reset")) return value_string
def list_servers(_): if SERVERS: W.prnt("", "\nAll matrix servers:") for server in SERVERS: W.prnt( "", " {color}{server}".format(color=W.color("chat_server"), server=server))
def execute(self, server, room, buff, tags): nick, color_name = sender_to_nick_and_color(room, self.sender) color = color_for_tags(color_name) event_tags = add_event_tags(self.event_id, nick, color, tags) event_tags.append("matrix_action") tags_string = ",".join(event_tags) data = "{prefix}{nick_color}{author}{ncolor} {msg}".format( prefix=W.prefix("action"), nick_color=W.color(color_name), author=nick, ncolor=W.color("reset"), msg=self.message) date = server_ts_to_weechat(self.timestamp) W.prnt_date_tags(buff, date, tags_string, data)
def matrix_bar_item_lag(data, item, window, buffer, extra_info): # pylint: disable=unused-argument for server in SERVERS.values(): if (buffer in server.buffers.values() or buffer == server.server_buffer): if server.lag >= 500: color = W.color("irc.color.item_lag_counting") if server.lag_done: color = W.color("irc.color.item_lag_finished") lag = "{0:.3f}" if round(server.lag) < 1000 else "{0:.0f}" lag_string = "Lag: {color}{lag}{ncolor}".format( lag=lag.format((server.lag / 1000)), color=color, ncolor=W.color("reset")) return lag_string return "" return ""
def execute(self, server, room, buff, tags): nick, color_name = sender_to_nick_and_color(room, self.sender) event_tags = add_event_tags(self.event_id, nick, None, []) # TODO this should be configurable action_color = "red" if self.prefix == "quit" else "green" data = ("{prefix}{color}{author}{ncolor} " "{del_color}({host_color}{user_id}{del_color})" "{action_color} {message} " "{channel_color}{room}{ncolor}").format( prefix=W.prefix(self.prefix), color=W.color(color_name), author=nick, ncolor=W.color("reset"), del_color=W.color("chat_delimiters"), host_color=W.color("chat_host"), user_id=self.sender, action_color=W.color(action_color), message=self.message, channel_color=W.color("chat_channel"), room="" if room.is_group() else room.named_room_name()) date = server_ts_to_weechat(self.timestamp) tags_string = ",".join(event_tags) W.prnt_date_tags(buff, date, tags_string, data)
def _print_message(self, message, room, buff, tags): nick, color_name = sender_to_nick_and_color(room, self.sender) color = color_for_tags(color_name) event_tags = add_event_tags(self.event_id, nick, color, tags) tags_string = ",".join(event_tags) prefix, prefix_color = sender_to_prefix_and_color(room, self.sender) prefix_string = ("" if not prefix else "{}{}{}".format( W.color(prefix_color), prefix, W.color("reset"))) data = "{prefix}{color}{author}{ncolor}\t{msg}".format( prefix=prefix_string, color=W.color(color_name), author=nick, ncolor=W.color("reset"), msg=message) date = server_ts_to_weechat(self.timestamp) W.prnt_date_tags(buff, date, tags_string, data)
def matrix_command_topic_cb(data, buffer, command): for server in SERVERS.values(): if buffer in server.buffers.values(): topic = None room_id = key_from_value(server.buffers, buffer) split_command = command.split(' ', 1) if len(split_command) == 2: topic = split_command[1] if not topic: room = server.rooms[room_id] if not room.topic: return W.WEECHAT_RC_OK if room.is_named(): message = ('{prefix}Topic for {color}{room}{ncolor} is ' '"{topic}"').format( prefix=W.prefix("network"), color=W.color("chat_buffer"), ncolor=W.color("reset"), room=room.named_room_name(), topic=room.topic) else: message = ('{prefix}Topic is "{topic}"').format( prefix=W.prefix("network"), topic=room.topic) date = int(time.time()) topic_date = room.topic_date.strftime("%a, %d %b %Y " "%H:%M:%S") tags = "matrix_topic,log1" W.prnt_date_tags(buffer, date, tags, message) # TODO the nick should be colored # TODO we should use the display name as well as # the user name here message = ("{prefix}Topic set by {author} on " "{date}").format(prefix=W.prefix("network"), author=room.topic_author, date=topic_date) W.prnt_date_tags(buffer, date, tags, message) return W.WEECHAT_RC_OK_EAT message = MatrixTopicMessage(server.client, room_id=room_id, topic=topic) server.send_or_queue(message) return W.WEECHAT_RC_OK_EAT elif buffer == server.server_buffer: message = ("{prefix}matrix: command \"topic\" must be " "executed on a Matrix channel buffer").format( prefix=W.prefix("error")) W.prnt(buffer, message) return W.WEECHAT_RC_OK_EAT return W.WEECHAT_RC_OK
def matrix_server_command_add(args): if len(args) < 2: message = ("{prefix}matrix: Too few arguments for command " "\"/matrix server add\" (see /matrix help server)").format( prefix=W.prefix("error")) W.prnt("", message) return elif len(args) > 4: message = ("{prefix}matrix: Too many arguments for command " "\"/matrix server add\" (see /matrix help server)").format( prefix=W.prefix("error")) W.prnt("", message) return def remove_server(server): for option in server.options.values(): W.config_option_free(option) del SERVERS[server.name] server_name = args[0] if server_name in SERVERS: message = ("{prefix}matrix: server {color}{server}{ncolor} " "already exists, can't add it").format( prefix=W.prefix("error"), color=W.color("chat_server"), server=server_name, ncolor=W.color("reset")) W.prnt("", message) return server = MatrixServer(server_name, matrix.globals.CONFIG) SERVERS[server.name] = server if len(args) >= 2: try: host, port = args[1].split(":", 1) except ValueError: host, port = args[1], None return_code = W.config_option_set(server.options["address"], host, 1) if return_code == W.WEECHAT_CONFIG_OPTION_SET_ERROR: remove_server(server) message = ("{prefix}Failed to set address for server " "{color}{server}{ncolor}, failed to add " "server.").format(prefix=W.prefix("error"), color=W.color("chat_server"), server=server.name, ncolor=W.color("reset")) W.prnt("", message) server = None return if port: return_code = W.config_option_set(server.options["port"], port, 1) if return_code == W.WEECHAT_CONFIG_OPTION_SET_ERROR: remove_server(server) message = ("{prefix}Failed to set port for server " "{color}{server}{ncolor}, failed to add " "server.").format(prefix=W.prefix("error"), color=W.color("chat_server"), server=server.name, ncolor=W.color("reset")) W.prnt("", message) server = None return if len(args) >= 3: user = args[2] return_code = W.config_option_set(server.options["username"], user, 1) if return_code == W.WEECHAT_CONFIG_OPTION_SET_ERROR: remove_server(server) message = ("{prefix}Failed to set user for server " "{color}{server}{ncolor}, failed to add " "server.").format(prefix=W.prefix("error"), color=W.color("chat_server"), server=server.name, ncolor=W.color("reset")) W.prnt("", message) server = None return if len(args) == 4: password = args[3] return_code = W.config_option_set(server.options["password"], password, 1) if return_code == W.WEECHAT_CONFIG_OPTION_SET_ERROR: remove_server(server) message = ("{prefix}Failed to set password for server " "{color}{server}{ncolor}, failed to add " "server.").format(prefix=W.prefix("error"), color=W.color("chat_server"), server=server.name, ncolor=W.color("reset")) W.prnt("", message) server = None return message = ("matrix: server {color}{server}{ncolor} " "has been added").format(server=server.name, color=W.color("chat_server"), ncolor=W.color("reset")) W.prnt("", message)
def matrix_server_command_listfull(args): def get_value_string(value, default_value): if value == default_value: if not value: value = "''" value_string = " ({value})".format(value=value) else: value_string = "{color}{value}{ncolor}".format( color=W.color("chat_value"), value=value, ncolor=W.color("reset")) return value_string for server_name in args: if server_name not in SERVERS: continue server = SERVERS[server_name] connected = "" W.prnt("", "") if server.connected: connected = "connected" else: connected = "not connected" message = ("Server: {server_color}{server}{delimiter_color}" " [{ncolor}{connected}{delimiter_color}]" "{ncolor}").format( server_color=W.color("chat_server"), server=server.name, delimiter_color=W.color("chat_delimiters"), connected=connected, ncolor=W.color("reset")) W.prnt("", message) option = server.options["autoconnect"] default_value = W.config_string_default(option) value = W.config_string(option) value_string = get_value_string(value, default_value) message = " autoconnect. : {value}".format(value=value_string) W.prnt("", message) option = server.options["address"] default_value = W.config_string_default(option) value = W.config_string(option) value_string = get_value_string(value, default_value) message = " address. . . : {value}".format(value=value_string) W.prnt("", message) option = server.options["port"] default_value = str(W.config_integer_default(option)) value = str(W.config_integer(option)) value_string = get_value_string(value, default_value) message = " port . . . . : {value}".format(value=value_string) W.prnt("", message) option = server.options["username"] default_value = W.config_string_default(option) value = W.config_string(option) value_string = get_value_string(value, default_value) message = " username . . : {value}".format(value=value_string) W.prnt("", message) option = server.options["password"] value = W.config_string(option) if value: value = "(hidden)" value_string = get_value_string(value, '') message = " password . . : {value}".format(value=value_string) W.prnt("", message)
def matrix_command_help(args): if not args: message = ("{prefix}matrix: Too few arguments for command " "\"/matrix help\" (see /matrix help help)").format( prefix=W.prefix("error")) W.prnt("", message) return for command in args: message = "" if command == "connect": message = ("{delimiter_color}[{ncolor}matrix{delimiter_color}] " "{ncolor}{cmd_color}/connect{ncolor} " "<server-name> [<server-name>...]" "\n\n" "connect to Matrix server(s)" "\n\n" "server-name: server to connect to" "(internal name)").format( delimiter_color=W.color("chat_delimiters"), cmd_color=W.color("chat_buffer"), ncolor=W.color("reset")) elif command == "disconnect": message = ("{delimiter_color}[{ncolor}matrix{delimiter_color}] " "{ncolor}{cmd_color}/disconnect{ncolor} " "<server-name> [<server-name>...]" "\n\n" "disconnect from Matrix server(s)" "\n\n" "server-name: server to disconnect" "(internal name)").format( delimiter_color=W.color("chat_delimiters"), cmd_color=W.color("chat_buffer"), ncolor=W.color("reset")) elif command == "reconnect": message = ("{delimiter_color}[{ncolor}matrix{delimiter_color}] " "{ncolor}{cmd_color}/reconnect{ncolor} " "<server-name> [<server-name>...]" "\n\n" "reconnect to Matrix server(s)" "\n\n" "server-name: server to reconnect" "(internal name)").format( delimiter_color=W.color("chat_delimiters"), cmd_color=W.color("chat_buffer"), ncolor=W.color("reset")) elif command == "server": message = ("{delimiter_color}[{ncolor}matrix{delimiter_color}] " "{ncolor}{cmd_color}/server{ncolor} " "add <server-name> <hostname>[:<port>]" "\n " "delete|list|listfull <server-name>" "\n\n" "list, add, or remove Matrix servers" "\n\n" " list: list servers (without argument, this " "list is displayed)\n" " listfull: list servers with detailed info for each " "server\n" " add: add a new server\n" " delete: delete a server\n" "server-name: server to reconnect (internal name)\n" " hostname: name or IP address of server\n" " port: port of server (default: 8448)\n" "\n" "Examples:" "\n /matrix server listfull" "\n /matrix server add matrix matrix.org:80" "\n /matrix server del matrix").format( delimiter_color=W.color("chat_delimiters"), cmd_color=W.color("chat_buffer"), ncolor=W.color("reset")) elif command == "help": message = ("{delimiter_color}[{ncolor}matrix{delimiter_color}] " "{ncolor}{cmd_color}/help{ncolor} " "<matrix-command> [<matrix-command>...]" "\n\n" "display help about Matrix commands" "\n\n" "matrix-command: a Matrix command name" "(internal name)").format( delimiter_color=W.color("chat_delimiters"), cmd_color=W.color("chat_buffer"), ncolor=W.color("reset")) elif command == "debug": message = ("{delimiter_color}[{ncolor}matrix{delimiter_color}] " "{ncolor}{cmd_color}/debug{ncolor} " "<debug-type> [<debug-type>...]" "\n\n" "enable/disable degugging for a Matrix subsystem" "\n\n" "debug-type: a Matrix debug type, one of messaging, " "timing, network").format( delimiter_color=W.color("chat_delimiters"), cmd_color=W.color("chat_buffer"), ncolor=W.color("reset")) else: message = ("{prefix}matrix: No help available, \"{command}\" " "is not a matrix command").format( prefix=W.prefix("error"), command=command) W.prnt("", "") W.prnt("", message) return