diff --git a/.weechat/.gitignore b/.weechat/.gitignore
deleted file mode 100644
index 541e52da..00000000
--- a/.weechat/.gitignore
+++ /dev/null
@@ -1 +0,0 @@
-urlserver_list.txt
diff --git a/.weechat/alias.conf b/.weechat/alias.conf
deleted file mode 100644
index 6252f238..00000000
--- a/.weechat/alias.conf
+++ /dev/null
@@ -1,49 +0,0 @@
-#
-# weechat -- alias.conf
-#
-# WARNING: It is NOT recommended to edit this file by hand,
-# especially if WeeChat is running.
-#
-# Use /set or similar command to change settings in WeeChat.
-#
-# For more info, see: https://weechat.org/doc/quickstart
-#
-
-[cmd]
-AAWAY = "allserv /away"
-AME = "allchan /me"
-AMSG = "allchan /msg *"
-ANICK = "allserv /nick"
-BEEP = "print -beep"
-BYE = "quit"
-C = "buffer clear"
-CHAT = "dcc chat"
-CL = "buffer clear"
-CLOSE = "buffer close"
-EXIT = "quit"
-IG = "ignore"
-J = "join"
-K = "kick"
-KB = "kickban"
-LEAVE = "part"
-M = "msg"
-MSGBUF = "command -buffer $1 * /input send $2-"
-MUB = "unban *"
-N = "names"
-Q = "query"
-REDRAW = "window refresh"
-SAY = "msg *"
-SIGNOFF = "quit"
-T = "topic"
-UB = "unban"
-UMODE = "mode $nick"
-V = "command core version"
-W = "who"
-WC = "window merge"
-WI = "whois"
-WII = "whois $1 $1"
-WW = "whowas"
-znc = "/quote znc"
-
-[completion]
-MSGBUF = "%(buffers_plugins_names)"
diff --git a/.weechat/aspell.conf b/.weechat/aspell.conf
deleted file mode 100644
index 27b16b83..00000000
--- a/.weechat/aspell.conf
+++ /dev/null
@@ -1,33 +0,0 @@
-#
-# weechat -- aspell.conf
-#
-# WARNING: It is NOT recommended to edit this file by hand,
-# especially if WeeChat is running.
-#
-# Use /set or similar command to change settings in WeeChat.
-#
-# For more info, see: https://weechat.org/doc/quickstart
-#
-
-[color]
-misspelled = lightred
-suggestion = default
-suggestion_delimiter_dict = cyan
-suggestion_delimiter_word = cyan
-
-[check]
-commands = "ame,amsg,away,command,cycle,kick,kickban,me,msg,notice,part,query,quit,topic"
-default_dict = ""
-during_search = off
-enabled = off
-real_time = off
-suggestions = -1
-word_min_length = 2
-
-[dict]
-
-[look]
-suggestion_delimiter_dict = " / "
-suggestion_delimiter_word = ","
-
-[option]
diff --git a/.weechat/autosort.conf b/.weechat/autosort.conf
deleted file mode 100644
index 9718abe9..00000000
--- a/.weechat/autosort.conf
+++ /dev/null
@@ -1,18 +0,0 @@
-#
-# weechat -- autosort.conf
-#
-# WARNING: It is NOT recommended to edit this file by hand,
-# especially if WeeChat is running.
-#
-# Use /set or similar command to change settings in WeeChat.
-#
-# For more info, see: https://weechat.org/doc/quickstart
-#
-
-[sorting]
-case_sensitive = off
-group_irc = on
-replacements = "[["##", "#"], ["##", "#"]]"
-rules = "[["core", 0], ["irc", 2], ["*", 1], ["irc.irc_raw", 0], ["irc.server", 1], ["irc.server.*.&*", 0], ["irc.server.*.#*", 1], ["irc.server.*.\\*status", 2]]"
-signals = "buffer_opened buffer_merged buffer_unmerged buffer_renamed"
-sort_on_config_change = on
diff --git a/.weechat/buffers.conf b/.weechat/buffers.conf
deleted file mode 100644
index 118f2abd..00000000
--- a/.weechat/buffers.conf
+++ /dev/null
@@ -1,80 +0,0 @@
-#
-# weechat -- buffers.conf
-#
-# WARNING: It is NOT recommended to edit this file by hand,
-# especially if WeeChat is running.
-#
-# Use /set or similar command to change settings in WeeChat.
-#
-# For more info, see: https://weechat.org/doc/quickstart
-#
-
-[color]
-current_bg = lightred
-current_fg = yellow
-default_bg = default
-default_fg = default
-hotlist_highlight_bg = default
-hotlist_highlight_fg = black
-hotlist_low_bg = default
-hotlist_low_fg = white
-hotlist_message_bg = default
-hotlist_message_fg = red
-hotlist_private_bg = default
-hotlist_private_fg = lightgreen
-none_channel_bg = default
-none_channel_fg = default
-number = lightgreen
-number_char = lightgreen
-prefix_bufname = default
-queries_default_bg = default
-queries_default_fg = default
-queries_highlight_bg = default
-queries_highlight_fg = default
-queries_message_bg = default
-queries_message_fg = default
-suffix_bufname = default
-whitelist_default_bg = default
-whitelist_default_fg = default
-whitelist_highlight_bg = default
-whitelist_highlight_fg = default
-whitelist_low_bg = default
-whitelist_low_fg = default
-whitelist_message_bg = default
-whitelist_message_fg = default
-whitelist_private_bg = default
-whitelist_private_fg = default
-
-[look]
-core_to_front = off
-detach = 600
-detach_buffer_immediately = ""
-detach_buffer_immediately_level = 2
-detach_display_window_number = off
-detach_displayed_buffers = on
-detach_free_content = off
-detach_query = off
-hide_merged_buffers = server
-hotlist_counter = off
-immune_detach_buffers = ""
-indenting = on
-indenting_amount = 2
-indenting_number = on
-jump_prev_next_visited_buffer = off
-mark_inactive = off
-mouse_move_buffer = on
-mouse_wheel = on
-name_crop_suffix = "+"
-name_size_max = 0
-number_char = "."
-prefix = off
-prefix_bufname = ""
-prefix_empty = on
-prefix_for_query = ""
-short_names = on
-show_lag = off
-show_number = on
-sort = number
-suffix_bufname = ""
-toggle_bar = on
-whitelist_buffers = ""
diff --git a/.weechat/buflist.conf b/.weechat/buflist.conf
deleted file mode 100644
index b8bc5a33..00000000
--- a/.weechat/buflist.conf
+++ /dev/null
@@ -1,38 +0,0 @@
-#
-# weechat -- buflist.conf
-#
-# WARNING: It is NOT recommended to edit this file by hand,
-# especially if WeeChat is running.
-#
-# Use /set or similar command to change settings in WeeChat.
-#
-# For more info, see: https://weechat.org/doc/quickstart
-#
-
-[look]
-auto_scroll = 50
-display_conditions = "${buffer.active}==1 && ${buffer.hidden}==0"
-enabled = on
-mouse_jump_visited_buffer = off
-mouse_move_buffer = on
-mouse_wheel = on
-nick_prefix = off
-nick_prefix_empty = on
-signals_refresh = ""
-sort = "number,-active"
-
-[format]
-buffer = "${format_number}${indent}${format_nick_prefix}${color_hotlist}${format_name}"
-buffer_current = "${color:,blue}${format_buffer}"
-hotlist = " ${color:green}(${hotlist}${color:green})"
-hotlist_highlight = "${color:magenta}"
-hotlist_low = "${color:white}"
-hotlist_message = "${color:brown}"
-hotlist_none = "${color:default}"
-hotlist_private = "${color:green}"
-hotlist_separator = "${color:default},"
-indent = " "
-lag = " ${color:green}[${color:brown}${lag}${color:green}]"
-name = "${name}"
-nick_prefix = "${color_nick_prefix}${nick_prefix}"
-number = "${color:green}${number}${if:${number_displayed}?.: }"
diff --git a/.weechat/charset.conf b/.weechat/charset.conf
deleted file mode 100644
index 00d304cd..00000000
--- a/.weechat/charset.conf
+++ /dev/null
@@ -1,18 +0,0 @@
-#
-# weechat -- charset.conf
-#
-# WARNING: It is NOT recommended to edit this file by hand,
-# especially if WeeChat is running.
-#
-# Use /set or similar command to change settings in WeeChat.
-#
-# For more info, see: https://weechat.org/doc/quickstart
-#
-
-[default]
-decode = "iso-8859-1"
-encode = ""
-
-[decode]
-
-[encode]
diff --git a/.weechat/colorize_nicks.conf b/.weechat/colorize_nicks.conf
deleted file mode 100644
index 6c880170..00000000
--- a/.weechat/colorize_nicks.conf
+++ /dev/null
@@ -1,19 +0,0 @@
-#
-# weechat -- colorize_nicks.conf
-#
-# WARNING: It is NOT recommended to edit this file by hand,
-# especially if WeeChat is running.
-#
-# Use /set or similar command to change settings in WeeChat.
-#
-# For more info, see: https://weechat.org/doc/quickstart
-#
-
-[look]
-blacklist_channels = ""
-blacklist_nicks = "so,root"
-colorize_input = off
-greedy_matching = on
-ignore_nicks_in_urls = off
-ignore_tags = ""
-min_nick_length = 2
diff --git a/.weechat/exec.conf b/.weechat/exec.conf
deleted file mode 100644
index 519ccc1b..00000000
--- a/.weechat/exec.conf
+++ /dev/null
@@ -1,18 +0,0 @@
-#
-# weechat -- exec.conf
-#
-# WARNING: It is NOT recommended to edit this file by hand,
-# especially if WeeChat is running.
-#
-# Use /set or similar command to change settings in WeeChat.
-#
-# For more info, see: https://weechat.org/doc/quickstart
-#
-
-[command]
-default_options = ""
-purge_delay = 0
-
-[color]
-flag_finished = lightred
-flag_running = lightgreen
diff --git a/.weechat/fifo.conf b/.weechat/fifo.conf
deleted file mode 100644
index 904985df..00000000
--- a/.weechat/fifo.conf
+++ /dev/null
@@ -1,14 +0,0 @@
-#
-# weechat -- fifo.conf
-#
-# WARNING: It is NOT recommended to edit this file by hand,
-# especially if WeeChat is running.
-#
-# Use /set or similar command to change settings in WeeChat.
-#
-# For more info, see: https://weechat.org/doc/quickstart
-#
-
-[file]
-enabled = on
-path = "%h/weechat_fifo"
diff --git a/.weechat/irc.conf b/.weechat/irc.conf
deleted file mode 100644
index 8ad50251..00000000
--- a/.weechat/irc.conf
+++ /dev/null
@@ -1,311 +0,0 @@
-#
-# weechat -- irc.conf
-#
-# WARNING: It is NOT recommended to edit this file by hand,
-# especially if WeeChat is running.
-#
-# Use /set or similar command to change settings in WeeChat.
-#
-# For more info, see: https://weechat.org/doc/quickstart
-#
-
-[look]
-buffer_open_before_autojoin = on
-buffer_open_before_join = off
-buffer_switch_autojoin = off
-buffer_switch_join = on
-color_nicks_in_names = off
-color_nicks_in_nicklist = off
-color_nicks_in_server_messages = on
-color_pv_nick_like_channel = on
-ctcp_time_format = "%a, %d %b %Y %T %z"
-display_away = local
-display_ctcp_blocked = on
-display_ctcp_reply = on
-display_ctcp_unknown = on
-display_host_join = on
-display_host_join_local = on
-display_host_quit = on
-display_join_message = ""
-display_old_topic = on
-display_pv_away_once = on
-display_pv_back = on
-highlight_channel = "$nick"
-highlight_pv = "$nick"
-highlight_server = "$nick"
-highlight_tags_restrict = "irc_privmsg,irc_notice"
-item_channel_modes_hide_args = "k"
-item_display_server = buffer_plugin
-item_nick_modes = on
-item_nick_prefix = on
-join_auto_add_chantype = off
-msgbuffer_fallback = current
-new_channel_position = none
-new_pv_position = none
-nick_completion_smart = speakers
-nick_mode = prefix
-nick_mode_empty = off
-nicks_hide_password = "nickserv"
-notice_as_pv = auto
-notice_welcome_redirect = on
-notice_welcome_tags = ""
-notify_tags_ison = "notify_message"
-notify_tags_whois = "notify_message"
-part_closes_buffer = off
-pv_buffer = independent
-pv_tags = "notify_private"
-raw_messages = 256
-server_buffer = independent
-smart_filter = on
-smart_filter_delay = 5
-smart_filter_join = on
-smart_filter_join_unmask = 30
-smart_filter_mode = "+"
-smart_filter_nick = on
-smart_filter_quit = on
-temporary_servers = off
-topic_strip_colors = off
-
-[color]
-input_nick = lightcyan
-item_channel_modes = default
-item_lag_counting = default
-item_lag_finished = yellow
-item_nick_modes = default
-message_join = green
-message_quit = red
-mirc_remap = "1,-1:darkgray"
-nick_prefixes = "y:lightred;q:lightred;a:lightcyan;o:lightgreen;h:lightmagenta;v:yellow;*:lightblue"
-notice = green
-reason_quit = default
-topic_current = default
-topic_new = white
-topic_old = default
-
-[network]
-autoreconnect_delay_growing = 2
-autoreconnect_delay_max = 600
-ban_mask_default = "*!$ident@$host"
-channel_encode = off
-colors_receive = on
-colors_send = on
-lag_check = 60
-lag_max = 1800
-lag_min_show = 500
-lag_reconnect = 0
-lag_refresh_interval = 1
-notify_check_ison = 1
-notify_check_whois = 5
-sasl_fail_unavailable = on
-send_unknown_commands = off
-whois_double_nick = off
-
-[msgbuffer]
-
-[ctcp]
-
-[ignore]
-
-[server_default]
-addresses = ""
-anti_flood_prio_high = 2
-anti_flood_prio_low = 2
-autoconnect = off
-autojoin = ""
-autoreconnect = on
-autoreconnect_delay = 10
-autorejoin = off
-autorejoin_delay = 30
-away_check = 0
-away_check_max_nicks = 25
-capabilities = ""
-command = ""
-command_delay = 0
-connection_timeout = 60
-ipv6 = on
-local_hostname = ""
-msg_kick = ""
-msg_part = "WeeChat ${info:version}"
-msg_quit = "WeeChat ${info:version}"
-nicks = "alpha,alpha1,alpha2,alpha3,alpha4"
-nicks_alternate = on
-notify = ""
-password = ""
-proxy = ""
-realname = ""
-sasl_fail = continue
-sasl_key = ""
-sasl_mechanism = plain
-sasl_password = ""
-sasl_timeout = 15
-sasl_username = ""
-ssl = off
-ssl_cert = ""
-ssl_dhkey_size = 2048
-ssl_fingerprint = ""
-ssl_priorities = "NORMAL:-VERS-SSL3.0"
-ssl_verify = on
-usermode = ""
-username = "alpha"
-
-[server]
-alydipha.addresses = "congenital-optimist.arbitrarydefinitions.com/6667"
-alydipha.proxy
-alydipha.ipv6
-alydipha.ssl = on
-alydipha.ssl_cert
-alydipha.ssl_priorities
-alydipha.ssl_dhkey_size
-alydipha.ssl_fingerprint = "83c4109c714c9f336963cdd3d5a4f95d0e20c1658c45b092d950a963c06a9fa272ed15eb9b642fc46700617d776d6a702da995d1b5eff7e5447f767ec33c9665"
-alydipha.ssl_verify
-alydipha.password = "${sec.data.znc}"
-alydipha.capabilities
-alydipha.sasl_mechanism
-alydipha.sasl_username
-alydipha.sasl_password
-alydipha.sasl_key
-alydipha.sasl_timeout
-alydipha.sasl_fail
-alydipha.autoconnect = on
-alydipha.autoreconnect
-alydipha.autoreconnect_delay
-alydipha.nicks
-alydipha.nicks_alternate
-alydipha.username = "alpha/alydipha"
-alydipha.realname
-alydipha.local_hostname
-alydipha.usermode
-alydipha.command
-alydipha.command_delay
-alydipha.autojoin
-alydipha.autorejoin
-alydipha.autorejoin_delay
-alydipha.connection_timeout
-alydipha.anti_flood_prio_high
-alydipha.anti_flood_prio_low
-alydipha.away_check
-alydipha.away_check_max_nicks
-alydipha.msg_kick
-alydipha.msg_part
-alydipha.msg_quit
-alydipha.notify
-cloudfoundry.addresses = "congenital-optimist.arbitrarydefinitions.com/6667"
-cloudfoundry.proxy
-cloudfoundry.ipv6
-cloudfoundry.ssl = on
-cloudfoundry.ssl_cert
-cloudfoundry.ssl_priorities
-cloudfoundry.ssl_dhkey_size
-cloudfoundry.ssl_fingerprint = "83c4109c714c9f336963cdd3d5a4f95d0e20c1658c45b092d950a963c06a9fa272ed15eb9b642fc46700617d776d6a702da995d1b5eff7e5447f767ec33c9665"
-cloudfoundry.ssl_verify
-cloudfoundry.password = "${sec.data.znc}"
-cloudfoundry.capabilities
-cloudfoundry.sasl_mechanism
-cloudfoundry.sasl_username
-cloudfoundry.sasl_password
-cloudfoundry.sasl_key
-cloudfoundry.sasl_timeout
-cloudfoundry.sasl_fail
-cloudfoundry.autoconnect = on
-cloudfoundry.autoreconnect
-cloudfoundry.autoreconnect_delay
-cloudfoundry.nicks
-cloudfoundry.nicks_alternate
-cloudfoundry.username = "alpha/cloudfoundry"
-cloudfoundry.realname
-cloudfoundry.local_hostname
-cloudfoundry.usermode
-cloudfoundry.command
-cloudfoundry.command_delay
-cloudfoundry.autojoin
-cloudfoundry.autorejoin
-cloudfoundry.autorejoin_delay
-cloudfoundry.connection_timeout
-cloudfoundry.anti_flood_prio_high
-cloudfoundry.anti_flood_prio_low
-cloudfoundry.away_check
-cloudfoundry.away_check_max_nicks
-cloudfoundry.msg_kick
-cloudfoundry.msg_part
-cloudfoundry.msg_quit
-cloudfoundry.notify
-pivotal.addresses = "congenital-optimist.arbitrarydefinitions.com/6667"
-pivotal.proxy
-pivotal.ipv6
-pivotal.ssl = on
-pivotal.ssl_cert
-pivotal.ssl_priorities
-pivotal.ssl_dhkey_size
-pivotal.ssl_fingerprint = "83c4109c714c9f336963cdd3d5a4f95d0e20c1658c45b092d950a963c06a9fa272ed15eb9b642fc46700617d776d6a702da995d1b5eff7e5447f767ec33c9665"
-pivotal.ssl_verify
-pivotal.password = "${sec.data.znc}"
-pivotal.capabilities
-pivotal.sasl_mechanism
-pivotal.sasl_username
-pivotal.sasl_password
-pivotal.sasl_key
-pivotal.sasl_timeout
-pivotal.sasl_fail
-pivotal.autoconnect = on
-pivotal.autoreconnect
-pivotal.autoreconnect_delay
-pivotal.nicks
-pivotal.nicks_alternate
-pivotal.username = "alpha/pivotal"
-pivotal.realname
-pivotal.local_hostname
-pivotal.usermode
-pivotal.command
-pivotal.command_delay
-pivotal.autojoin
-pivotal.autorejoin
-pivotal.autorejoin_delay
-pivotal.connection_timeout
-pivotal.anti_flood_prio_high
-pivotal.anti_flood_prio_low
-pivotal.away_check
-pivotal.away_check_max_nicks
-pivotal.msg_kick
-pivotal.msg_part
-pivotal.msg_quit
-pivotal.notify
-mozilla.addresses = "congenital-optimist.arbitrarydefinitions.com/6667"
-mozilla.proxy
-mozilla.ipv6
-mozilla.ssl = on
-mozilla.ssl_cert
-mozilla.ssl_priorities
-mozilla.ssl_dhkey_size
-mozilla.ssl_fingerprint = "83c4109c714c9f336963cdd3d5a4f95d0e20c1658c45b092d950a963c06a9fa272ed15eb9b642fc46700617d776d6a702da995d1b5eff7e5447f767ec33c9665"
-mozilla.ssl_verify
-mozilla.password = "${sec.data.znc}"
-mozilla.capabilities
-mozilla.sasl_mechanism
-mozilla.sasl_username
-mozilla.sasl_password
-mozilla.sasl_key
-mozilla.sasl_timeout
-mozilla.sasl_fail
-mozilla.autoconnect = on
-mozilla.autoreconnect
-mozilla.autoreconnect_delay
-mozilla.nicks
-mozilla.nicks_alternate
-mozilla.username = "alpha/mozilla"
-mozilla.realname
-mozilla.local_hostname
-mozilla.usermode
-mozilla.command
-mozilla.command_delay
-mozilla.autojoin = "#rust,#rust-beginners"
-mozilla.autorejoin
-mozilla.autorejoin_delay
-mozilla.connection_timeout
-mozilla.anti_flood_prio_high
-mozilla.anti_flood_prio_low
-mozilla.away_check
-mozilla.away_check_max_nicks
-mozilla.msg_kick
-mozilla.msg_part
-mozilla.msg_quit
-mozilla.notify
diff --git a/.weechat/iset.conf b/.weechat/iset.conf
deleted file mode 100644
index 35e1653a..00000000
--- a/.weechat/iset.conf
+++ /dev/null
@@ -1,37 +0,0 @@
-#
-# weechat -- iset.conf
-#
-# WARNING: It is NOT recommended to edit this file by hand,
-# especially if WeeChat is running.
-#
-# Use /set or similar command to change settings in WeeChat.
-#
-# For more info, see: https://weechat.org/doc/quickstart
-#
-
-[color]
-bg_selected = red
-help_default_value = green
-help_option_name = white
-help_text = default
-option = default
-option_selected = white
-type = brown
-type_selected = yellow
-value = cyan
-value_diff = magenta
-value_diff_selected = lightmagenta
-value_selected = lightcyan
-value_undef = green
-value_undef_selected = lightgreen
-
-[help]
-show_help_bar = on
-show_help_extra_info = on
-show_plugin_description = off
-
-[look]
-scroll_horiz = 10
-show_current_line = on
-use_mute = off
-value_search_char = "="
diff --git a/.weechat/logger.conf b/.weechat/logger.conf
deleted file mode 100644
index 09b543ed..00000000
--- a/.weechat/logger.conf
+++ /dev/null
@@ -1,33 +0,0 @@
-#
-# weechat -- logger.conf
-#
-# WARNING: It is NOT recommended to edit this file by hand,
-# especially if WeeChat is running.
-#
-# Use /set or similar command to change settings in WeeChat.
-#
-# For more info, see: https://weechat.org/doc/quickstart
-#
-
-[look]
-backlog = 20
-
-[color]
-backlog_end = default
-backlog_line = default
-
-[file]
-auto_log = on
-flush_delay = 120
-info_lines = off
-mask = "$plugin.$name.weechatlog"
-name_lower_case = on
-nick_prefix = ""
-nick_suffix = ""
-path = "%h/logs/"
-replacement_char = "_"
-time_format = "%Y-%m-%d %H:%M:%S"
-
-[level]
-
-[mask]
diff --git a/.weechat/perl/autoload/highmon.pl b/.weechat/perl/autoload/highmon.pl
deleted file mode 120000
index 2eb5e1e5..00000000
--- a/.weechat/perl/autoload/highmon.pl
+++ /dev/null
@@ -1 +0,0 @@
-../highmon.pl
\ No newline at end of file
diff --git a/.weechat/perl/autoload/iset.pl b/.weechat/perl/autoload/iset.pl
deleted file mode 120000
index 2746e0d8..00000000
--- a/.weechat/perl/autoload/iset.pl
+++ /dev/null
@@ -1 +0,0 @@
-../iset.pl
\ No newline at end of file
diff --git a/.weechat/perl/autoload/perlexec.pl b/.weechat/perl/autoload/perlexec.pl
deleted file mode 120000
index dcfce2f1..00000000
--- a/.weechat/perl/autoload/perlexec.pl
+++ /dev/null
@@ -1 +0,0 @@
-../perlexec.pl
\ No newline at end of file
diff --git a/.weechat/perl/highmon.pl b/.weechat/perl/highmon.pl
deleted file mode 100644
index 1c077125..00000000
--- a/.weechat/perl/highmon.pl
+++ /dev/null
@@ -1,1139 +0,0 @@
-#
-# highmon.pl - Highlight Monitoring for weechat 0.3.0
-# Version 2.5
-#
-# Add 'Highlight Monitor' buffer/bar to log all highlights in one spot
-#
-# Usage:
-# /highmon [help] | [monitor [channel [server]]] | [clean default|orphan|all] | clearbar
-# Command wrapper for highmon commands
-#
-# /highmon clean default|orphan|all will clean the config section of default 'on' entries,
-# channels you are no longer joined, or both
-#
-# /highmon clearbar will clear the contents of highmon's bar output
-#
-# /highmon monitor [channel] [server] is used to toggle a highlight monitoring on and off, this
-# can be used in the channel buffer for the channel you wish to toggle, or be given
-# with arguments e.g. /highmon monitor #weechat freenode
-#
-# /set plugins.var.perl.highmon.alignment
-# The config setting "alignment" can be changed to;
-# "channel", "schannel", "nchannel", "channel,nick", "schannel,nick", "nchannel,nick"
-# to change how the monitor appears
-# The 'channel' value will show: "#weechat"
-# The 'schannel' value will show: "6"
-# The 'nchannel' value will show: "6:#weechat"
-#
-# /set plugins.var.perl.highmon.short_names
-# Setting this to 'on' will trim the network name from highmon, ala buffers.pl
-#
-# /set plugins.var.perl.highmon.merge_private
-# Setting this to 'on' will merge private messages to highmon's display
-#
-# /set plugins.var.perl.highmon.color_buf
-# This turns colored buffer names on or off, you can also set a single fixed color by using a weechat color name.
-# This *must* be a valid color name, or weechat will likely do unexpected things :)
-#
-# /set plugins.var.perl.highmon.hotlist_show
-# Setting this to 'on' will let the highmon buffer appear in hotlists
-# (status bar/buffer.pl)
-#
-# /set plugins.var.perl.highmon.away_only
-# Setting this to 'on' will only put messages in the highmon buffer when
-# you set your status to away
-#
-# /set plugins.var.perl.highmon.logging
-# Toggles logging status for highmon buffer (default: off)
-#
-# /set plugins.var.perl.highmon.output
-# Changes where output method of highmon; takes either "bar" or "buffer" (default; buffer)
-# /set plugins.var.perl.highmon.bar_lines
-# Changes the amount of lines the output bar will hold.
-# (Only appears once output has been set to bar, defaults to 10)
-# /set plugins.var.perl.highmon.bar_scrolldown
-# Toggles the bar scrolling at the bottom when new highlights are received
-# (Only appears once output has been set to bar, defaults to off)
-#
-# /set plugins.var.perl.highmon.nick_prefix
-# /set plugins.var.perl.highmon.nick_suffix
-# Sets the prefix and suffix chars in the highmon buffer
-# (Defaults to <> if nothing set, and blank if there is)
-#
-# servername.#channel
-# servername is the internal name for the server (set when you use /server add)
-# #channel is the channel name, (where # is whatever channel type that channel happens to be)
-#
-# Optional, set up tweaks; Hide the status and input lines on highmon
-#
-# /set weechat.bar.status.conditions "${window.buffer.full_name} != perl.highmon"
-# /set weechat.bar.input.conditions "${window.buffer.full_name} != perl.highmon"
-#
-
-# Bugs and feature requests at: https://github.com/KenjiE20/highmon
-
-# History:
-# 2014-08-16, KenjiE20 <longbow@longbowslair.co.uk>:
-# v2.5: -add: clearbar command to clear bar output
-# -add: firstrun output prompt to check the help text for set up hints as they were being missed
-# and update hint for conditions to use eval
-# -change: Make all outputs use the date callback for more accurate timestamps (thanks Germainz)
-# 2013-12-04, KenjiE20 <longbow@longbowslair.co.uk>:
-# v2.4: -add: Support for eval style colour codes in time format used for bar output
-# 2013-10-22, KenjiE20 <longbow@longbowslair.co.uk>:
-# v2.3.3.2: -fix: Typo in fix command
-# 2013-10-10, KenjiE20 <longbow@longbowslair.co.uk>:
-# v2.3.3.1: -fix: Typo in closed buffer warning
-# 2013-10-07, KenjiE20 <longbow@longbowslair.co.uk>:
-# v2.3.3: -add: Warning and fixer for accidental buffer closes
-# 2013-01-15, KenjiE20 <longbow@longbowslair.co.uk>:
-# v2.3.2: -fix: Let bar output use the string set in weechat's config option
-# -add: github info
-# 2012-04-15, KenjiE20 <longbow@longbowslair.co.uk>:
-# v2.3.1: -fix: Colour tags in bar timestamp string
-# 2012-02-28, KenjiE20 <longbow@longbowslair.co.uk>:
-# v2.3: -feature: Added merge_private option to display private messages (default: off)
-# -fix: Channel name colours now show correctly when set to on
-# 2011-08-07, Sitaktif <romainchossart_at_gmail.com>:
-# v2.2.1: -feature: Add "bar_scrolldown" option to have the bar display the latest hl at anytime
-# -fix: Set up bar-specific config at startup if 'output' is already configured as 'bar'
-# 2010-12-22, KenjiE20 <longbow@longbowslair.co.uk>:
-# v2.2: -change: Use API instead of config to find channel colours, ready for 0.3.4 and 256 colours
-# 2010-12-13, idl0r & KenjiE20 <longbow@longbowslair.co.uk>:
-# v2.1.3: -fix: perl errors caused by bar line counter
-# -fix: Add command list to inbuilt help
-# 2010-09-30, KenjiE20 <longbow@longbowslair.co.uk>:
-# v2.1.2: -fix: logging config was not correctly toggling back on (thanks to sleo for noticing)
-# -version sync w/ chanmon
-# 2010-08-27, KenjiE20 <longbow@longbowslair.co.uk>:
-# v2.1: -feature: Add 'nchannel' option to alignment to display buffer and name
-# 2010-04-25, KenjiE20 <longbow@longbowslair.co.uk>:
-# v2.0: Release as version 2.0
-# 2010-04-24, KenjiE20 <longbow@longbowslair.co.uk>:
-# v1.9: Rewrite for v2.0
-# Bring feature set in line with chanmon 2.0
-# -code change: Made more subs to shrink the code down in places
-# -fix: Stop highmon attempting to double load/hook
-# -fix: Add version dependant check for away status
-# 2010-01-25, KenjiE20 <longbow@longbowslair.co.uk>:
-# v1.7: -fixture: Let highmon be aware of nick_prefix/suffix
-# and allow custom prefix/suffix for chanmon buffer
-# (Defaults to <> if nothing set, and blank if there is)
-# (Thanks to m4v for these)
-# 2009-09-07, KenjiE20 <longbow@longbowslair.co.uk>:
-# v1.6: -feature: colored buffer names
-# -change: version sync with chanmon
-# 2009-09-05, KenjiE20 <longbow@longbowslair.co.uk>:
-# v1.2: -fix: disable buffer highlight
-# 2009-09-02, KenjiE20 <longbow@longbowslair.co.uk>:
-# v.1.1.1 -change: Stop unsightly text block on '/help'
-# 2009-08-10, KenjiE20 <longbow@longbowslair.co.uk>:
-# v1.1: In-client help added
-# 2009-08-02, KenjiE20 <longbow@longbowslair.co.uk>:
-# v1.0: Initial Public Release
-
-# Copyright (c) 2009 by KenjiE20 <longbow@longbowslair.co.uk>
-#
-# This program is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 3 of the License, or
-# (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program. If not, see <http://www.gnu.org/licenses/>.
-#
-
-@bar_lines = ();
-@bar_lines_time = ();
-# Replicate info earlier for in-client help
-
-$highmonhelp = weechat::color("bold")."/highmon [help] | [monitor [channel [server]]] | [clean default|orphan|all] | clearbar".weechat::color("-bold")."
- Command wrapper for highmon commands
-
-".weechat::color("bold")."/highmon clean default|orphan|all".weechat::color("-bold")." will clean the config section of default 'on' entries, channels you are no longer joined, or both
-
-".weechat::color("bold")."/highmon clearbar".weechat::color("-bold")." will clear the contents of highmon's bar output
-
-".weechat::color("bold")."/highmon monitor [channel] [server]".weechat::color("-bold")." is used to toggle a highlight monitoring on and off, this can be used in the channel buffer for the channel you wish to toggle, or be given with arguments e.g. /highmon monitor #weechat freenode
-
-".weechat::color("bold")."/set plugins.var.perl.highmon.alignment".weechat::color("-bold")."
- The config setting \"alignment\" can be changed to;
- \"channel\", \"schannel\", \"nchannel\", \"channel,nick\", \"schannel,nick\", \"nchannel,nick\"
- to change how the monitor appears
- The 'channel' value will show: \"#weechat\"
- The 'schannel' value will show: \"6\"
- The 'nchannel' value will show: \"6:#weechat\"
-
-".weechat::color("bold")."/set plugins.var.perl.highmon.short_names".weechat::color("-bold")."
- Setting this to 'on' will trim the network name from highmon, ala buffers.pl
-
-".weechat::color("bold")."/set plugins.var.perl.highmon.merge_private".weechat::color("-bold")."
- Setting this to 'on' will merge private messages to highmon's display
-
-".weechat::color("bold")."/set plugins.var.perl.highmon.color_buf".weechat::color("-bold")."
- This turns colored buffer names on or off, you can also set a single fixed color by using a weechat color name.
- This ".weechat::color("bold")."must".weechat::color("-bold")." be a valid color name, or weechat will likely do unexpected things :)
-
-".weechat::color("bold")."/set plugins.var.perl.highmon.hotlist_show".weechat::color("-bold")."
-Setting this to 'on' will let the highmon buffer appear in hotlists (status bar/buffer.pl)
-
-".weechat::color("bold")."/set plugins.var.perl.highmon.away_only".weechat::color("-bold")."
-Setting this to 'on' will only put messages in the highmon buffer when you set your status to away
-
-".weechat::color("bold")."/set plugins.var.perl.highmon.logging".weechat::color("-bold")."
- Toggles logging status for highmon buffer (default: off)
-
-".weechat::color("bold")."/set plugins.var.perl.highmon.output".weechat::color("-bold")."
- Changes where output method of highmon; takes either \"bar\" or \"buffer\" (default; buffer)
-".weechat::color("bold")."/set plugins.var.perl.highmon.bar_lines".weechat::color("-bold")."
- Changes the amount of lines the output bar will hold.
- (Only appears once output has been set to bar, defaults to 10)
-".weechat::color("bold")."/set plugins.var.perl.highmon.bar_scrolldown".weechat::color("-bold")."
- Toggles the bar scrolling at the bottom when new highlights are received
- (Only appears once output has been set to bar, defaults to off)
-
-".weechat::color("bold")."/set plugins.var.perl.highmon.nick_prefix".weechat::color("-bold")."
-".weechat::color("bold")."/set plugins.var.perl.highmon.nick_suffix".weechat::color("-bold")."
- Sets the prefix and suffix chars in the highmon buffer
- (Defaults to <> if nothing set, and blank if there is)
-
-".weechat::color("bold")."servername.#channel".weechat::color("-bold")."
- servername is the internal name for the server (set when you use /server add)
- #channel is the channel name, (where # is whatever channel type that channel happens to be)
-
-".weechat::color("bold")."Optional, set up tweaks;".weechat::color("-bold")." Hide the status and input lines on highmon
-
-".weechat::color("bold")."/set weechat.bar.status.conditions \"\${window.buffer.full_name} != perl.highmon\"".weechat::color("-bold")."
-".weechat::color("bold")."/set weechat.bar.input.conditions \"\${window.buffer.full_name} != perl.highmon\"".weechat::color("-bold");
-# Print verbose help
-sub print_help
-{
- weechat::print("", "\t".weechat::color("bold")."Highmon Help".weechat::color("-bold")."\n\n");
- weechat::print("", "\t".$highmonhelp);
- return weechat::WEECHAT_RC_OK;
-}
-
-# Bar item build
-sub highmon_bar_build
-{
- # Get max lines
- $max_lines = weechat::config_get_plugin("bar_lines");
- $max_lines = $max_lines ? $max_lines : 10;
- $str = '';
- $align_num = 0;
- $count = 0;
- # Keep lines within max
- while ($#bar_lines > $max_lines)
- {
- shift(@bar_lines);
- shift(@bar_lines_time);
- }
- # So long as we have some lines, build a string
- if (@bar_lines)
- {
- # Build loop
- $sep = " ".weechat::config_string(weechat::config_get("weechat.look.prefix_suffix"))." ";
- foreach(@bar_lines)
- {
- # Find max align needed
- $prefix_num = (index(weechat::string_remove_color($_, ""), $sep));
- $align_num = $prefix_num if ($prefix_num > $align_num);
- }
- foreach(@bar_lines)
- {
- # Get align for this line
- $prefix_num = (index(weechat::string_remove_color($_, ""), $sep));
-
- # Make string
- $str = $str.$bar_lines_time[$count]." ".(" " x ($align_num - $prefix_num)).$_."\n";
- # Increment count for sync with time list
- $count++;
- }
- }
- return $str;
-}
-
-# Make a new bar
-sub highmon_bar_open
-{
- # Make the bar item
- weechat::bar_item_new("highmon", "highmon_bar_build", "");
-
- $highmon_bar = weechat::bar_new ("highmon", "off", 100, "root", "", "bottom", "vertical", "vertical", 0, 0, "default", "cyan", "default", "on", "highmon");
-
- return weechat::WEECHAT_RC_OK;
-}
-# Close bar
-sub highmon_bar_close
-{
- # Find if bar exists
- $highmon_bar = weechat::bar_search("highmon");
- # If is does, close it
- if ($highmon_bar ne "")
- {
- weechat::bar_remove($highmon_bar);
- }
-
- # Find if bar item exists
- $highmon_bar_item = weechat::bar_item_search("highmon_bar");
- # If is does, close it
- if ($highmon_bar_item ne "")
- {
- weechat::bar_remove($highmon_bar_item);
- }
-
- @bar_lines = ();
- return weechat::WEECHAT_RC_OK;
-}
-
-# Make a new buffer
-sub highmon_buffer_open
-{
- # Search for pre-existing buffer
- $highmon_buffer = weechat::buffer_search("perl", "highmon");
-
- # Make a new buffer
- if ($highmon_buffer eq "")
- {
- $highmon_buffer = weechat::buffer_new("highmon", "highmon_buffer_input", "", "highmon_buffer_close", "");
- }
-
- # Turn off notify, highlights
- if ($highmon_buffer ne "")
- {
- if (weechat::config_get_plugin("hotlist_show" eq "off"))
- {
- weechat::buffer_set($highmon_buffer, "notify", "0");
- }
- weechat::buffer_set($highmon_buffer, "highlight_words", "-");
- weechat::buffer_set($highmon_buffer, "title", "Highlight Monitor");
- # Set no_log
- if (weechat::config_get_plugin("logging") eq "off")
- {
- weechat::buffer_set($highmon_buffer, "localvar_set_no_log", "1");
- }
- }
- return weechat::WEECHAT_RC_OK;
-}
-# Buffer input has no action
-sub highmon_buffer_input
-{
- return weechat::WEECHAT_RC_OK;
-}
-# Close up
-sub highmon_buffer_close
-{
- $highmon_buffer = "";
- # If user hasn't changed output style warn user
- if (weechat::config_get_plugin("output") eq "buffer")
- {
- weechat::print("", "\tHighmon buffer has been closed but output is still set to buffer, unusual results may occur. To recreate the buffer use ".weechat::color("bold")."/highmon fix".weechat::color("-bold"));
- }
- return weechat::WEECHAT_RC_OK;
-}
-
-# Highmon command wrapper
-sub highmon_command_cb
-{
- $data = $_[0];
- $buffer = $_[1];
- $args = $_[2];
- my $cmd = '';
- my $arg = '';
-
- if ($args ne "")
- {
- # Split argument up
- @arg_array = split(/ /,$args);
- # Take first as command
- $cmd = shift(@arg_array);
- # Rebuild string to pass to subs
- if (@arg_array)
- {
- $arg = join(" ", @arg_array);
- }
- }
-
- # Help command
- if ($cmd eq "" || $cmd eq "help")
- {
- print_help();
- }
- # /monitor command
- elsif ($cmd eq "monitor")
- {
- highmon_toggle($data, $buffer, $arg);
- }
- # /highclean command
- elsif ($cmd eq "clean")
- {
- highmon_config_clean($data, $buffer, $arg);
- }
- # clearbar command
- elsif ($cmd eq "clearbar")
- {
- if (weechat::config_get_plugin("output") eq "bar")
- {
- @bar_lines = ();
- weechat::bar_item_update("highmon");
- }
- }
- # Fix closed buffer
- elsif ($cmd eq "fix")
- {
- if (weechat::config_get_plugin("output") eq "buffer" && $highmon_buffer eq "")
- {
- highmon_buffer_open();
- }
- }
- return weechat::WEECHAT_RC_OK;
-}
-
-# Clean up config entries
-sub highmon_config_clean
-{
- $data = $_[0];
- $buffer = $_[1];
- $args = $_[2];
-
- # Don't do anything if bad option given
- if ($args ne "default" && $args ne "orphan" && $args ne "all")
- {
- weechat::print("", "\thighmon.pl: Unknown option");
- return weechat::WEECHAT_RC_OK;
- }
-
- @chans = ();
- # Load an infolist of highmon options
- $infolist = weechat::infolist_get("option", "", "*highmon*");
- while (weechat::infolist_next($infolist))
- {
- $name = weechat::infolist_string($infolist, "option_name");
- $name =~ s/perl\.highmon\.(\w*)\.([#&\+!])(.*)/$1.$2$3/;
- if ($name =~ /^(.*)\.([#&\+!])(.*)$/)
- {
- $action = 0;
- # Clean up all 'on's
- if ($args eq "default" || $args eq "all")
- {
- # If value in config is "on"
- if (weechat::config_get_plugin($name) eq "on")
- {
- # Unset and if successful flag as changed
- $rc = weechat::config_unset_plugin($name);
- if ($rc eq weechat::WEECHAT_CONFIG_OPTION_UNSET_OK_REMOVED)
- {
- $action = 1;
- }
- }
- }
- # Clean non joined
- if ($args eq "orphan" || $args eq "all")
- {
- # If we can't find the buffer for this entry
- if (weechat::buffer_search("irc", $name) eq "")
- {
- # Unset and if successful flag as changed
- $rc = weechat::config_unset_plugin($name);
- if ($rc eq weechat::WEECHAT_CONFIG_OPTION_UNSET_OK_REMOVED)
- {
- $action = 1;
- }
- }
- }
- # Add changed entry names to list
- push (@chans, $name) if ($action);
- }
- }
- weechat::infolist_free($infolist);
- # If channels were cleaned from config
- if (@chans)
- {
- # If only one entry
- if (@chans == 1)
- {
- $str = "\thighmon.pl: Cleaned ".@chans." entry from the config:";
- }
- else
- {
- $str = "\thighmon.pl: Cleaned ".@chans." entries from the config:";
- }
- # Build a list of channels
- foreach(@chans)
- {
- $str = $str." ".$_;
- }
- # Print what happened
- weechat::print("",$str);
- }
- # Config seemed to be clean
- else
- {
- weechat::print("", "\thighmon.pl: No entries removed");
- }
- return weechat::WEECHAT_RC_OK;
-}
-
-# Check config elements
-sub highmon_config_init
-{
- # First run default
- if (!(weechat::config_is_set_plugin ("first_run")))
- {
- if (weechat::config_get_plugin("first_run") ne "true")
- {
- weechat::print("", "\tThis appears to be the first time highmon has been run. For help and common set up hints see /highmon help");
- weechat::config_set_plugin("first_run", "true");
- }
- }
- # Alignment default
- if (!(weechat::config_is_set_plugin ("alignment")))
- {
- weechat::config_set_plugin("alignment", "channel");
- }
- if (weechat::config_get_plugin("alignment") eq "")
- {
- weechat::config_set_plugin("alignment", "none");
- }
-
- # Short name default
- if (!(weechat::config_is_set_plugin ("short_names")))
- {
- weechat::config_set_plugin("short_names", "off");
- }
-
- # Coloured names default
- if (!(weechat::config_is_set_plugin ("color_buf")))
- {
- weechat::config_set_plugin("color_buf", "on");
- }
-
- # Hotlist show default
- if (!(weechat::config_is_set_plugin ("hotlist_show")))
- {
- weechat::config_set_plugin("hotlist_show", "off");
- }
-
- # Away only default
- if (!(weechat::config_is_set_plugin ("away_only")))
- {
- weechat::config_set_plugin("away_only", "off");
- }
-
- # highmon log default
- if (!(weechat::config_is_set_plugin ("logging")))
- {
- weechat::config_set_plugin("logging", "off");
- }
-
- # Output default
- if (!(weechat::config_is_set_plugin ("output")))
- {
- weechat::config_set_plugin("output", "buffer");
- }
-
- # Private message merging
- if (!(weechat::config_is_set_plugin ("merge_private")))
- {
- weechat::config_set_plugin("merge_private", "off");
- }
-
- # Set bar config in case output was set to "bar" before even changing the setting
- if (weechat::config_get_plugin("output") eq "bar")
- {
- # Output bar lines default
- if (!(weechat::config_is_set_plugin ("bar_lines")))
- {
- weechat::config_set_plugin("bar_lines", "10");
- }
- if (!(weechat::config_is_set_plugin ("bar_scrolldown")))
- {
- weechat::config_set_plugin("bar_scrolldown", "off");
- }
- }
-
- # Check for exisiting prefix/suffix chars, and setup accordingly
- $prefix = weechat::config_get("irc.look.nick_prefix");
- $prefix = weechat::config_string($prefix);
- $suffix = weechat::config_get("irc.look.nick_suffix");
- $suffix = weechat::config_string($suffix);
-
- if (!(weechat::config_is_set_plugin("nick_prefix")))
- {
- if ($prefix eq "" && $suffix eq "")
- {
- weechat::config_set_plugin("nick_prefix", "<");
- }
- else
- {
- weechat::config_set_plugin("nick_prefix", "");
- }
- }
-
- if (!(weechat::config_is_set_plugin("nick_suffix")))
- {
- if ($prefix eq "" && $suffix eq "")
- {
- weechat::config_set_plugin("nick_suffix", ">");
- }
- else
- {
- weechat::config_set_plugin("nick_suffix", "");
- }
- }
-}
-
-# Get config updates
-sub highmon_config_cb
-{
- $point = $_[0];
- $name = $_[1];
- $value = $_[2];
-
- $name =~ s/^plugins\.var\.perl\.highmon\.//;
-
- # Set logging on buffer
- if ($name eq "logging")
- {
- # Search for pre-existing buffer
- $highmon_buffer = weechat::buffer_search("perl", "highmon");
- if ($value eq "off")
- {
- weechat::buffer_set($highmon_buffer, "localvar_set_no_log", "1");
- }
- else
- {
- weechat::buffer_set($highmon_buffer, "localvar_del_no_log", "");
- }
- }
- # Output changer
- elsif ($name eq "output")
- {
- if ($value eq "bar")
- {
- # Search for pre-existing buffer
- $highmon_buffer = weechat::buffer_search("perl", "highmon");
- # Close if it exists
- if ($highmon_buffer ne "")
- {
- weechat::buffer_close($highmon_buffer)
- }
-
- # Output bar lines default
- if (!(weechat::config_is_set_plugin ("bar_lines")))
- {
- weechat::config_set_plugin("bar_lines", "10");
- }
- if (!(weechat::config_is_set_plugin ("bar_scrolldown")))
- {
- weechat::config_set_plugin("bar_scrolldown", "off");
- }
- # Make a bar if doesn't exist
- highmon_bar_open();
- }
- elsif ($value eq "buffer")
- {
- # If a bar exists, close it
- highmon_bar_close();
- # Open buffer
- highmon_buffer_open();
- }
-
- }
- # Change if hotlist config changes
- elsif ($name eq "hotlist_show")
- {
- # Search for pre-existing buffer
- $highmon_buffer = weechat::buffer_search("perl", "highmon");
- if ($value eq "off" && $highmon_buffer)
- {
- weechat::buffer_set($highmon_buffer, "notify", "0");
- }
- elsif ($value ne "off" && $highmon_buffer)
- {
- weechat::buffer_set($highmon_buffer, "notify", "3");
- }
- }
- elsif ($name eq "weechat.look.prefix_suffix")
- {
- if (weechat::config_get_plugin("output") eq "bar")
- {
- @bar_lines = ();
- weechat::print("", "\thighmon: weechat.look.prefix_suffix changed, clearing highmon bar");
- weechat::bar_item_update("highmon");
- }
- }
- return weechat::WEECHAT_RC_OK;
-}
-
-# Set up weechat hooks / commands
-sub highmon_hook
-{
- weechat::hook_print("", "", "", 0, "highmon_new_message", "");
- weechat::hook_command("highclean", "Highmon config clean up", "default|orphan|all", " default: Cleans all config entries with the default \"on\" value\n orphan: Cleans all config entries for channels you aren't currently joined\n all: Does both defaults and orphan", "default|orphan|all", "highmon_config_clean", "");
-
- weechat::hook_command("highmon", "Highmon help", "[help] | [monitor [channel [server]]] | [clean default|orphan|all] | clearbar", " help: Print help on config options for highmon\n monitor: Toggles monitoring for a channel\n clean: Highmon config clean up (/highclean)\nclearbar: Clear Highmon bar", "help || monitor %(irc_channels) %(irc_servers) || clean default|orphan|all || clearbar", "highmon_command_cb", "");
-
- weechat::hook_config("plugins.var.perl.highmon.*", "highmon_config_cb", "");
- weechat::hook_config("weechat.look.prefix_suffix", "highmon_config_cb", "");
-}
-
-# Main body, Callback for hook_print
-sub highmon_new_message
-{
- my $net = "";
- my $chan = "";
- my $nick = "";
- my $outstr = "";
- my $window_displayed = "";
- my $dyncheck = "0";
-
-# DEBUG point
-# $string = "\t"."0: ".$_[0]." 1: ".$_[1]." 2: ".$_[2]." 3: ".$_[3]." 4: ".$_[4]." 5: ".$_[5]." 6: ".$_[6]." 7: ".$_[7];
-# weechat::print("", "\t".$string);
-
- $cb_datap = $_[0];
- $cb_bufferp = $_[1];
- $cb_date = $_[2];
- $cb_tags = $_[3];
- $cb_disp = $_[4];
- $cb_high = $_[5];
- $cb_prefix = $_[6];
- $cb_msg = $_[7];
-
- # Only work on highlighted messages or private message when enabled
- if ($cb_high == "1" || (weechat::config_get_plugin("merge_private") eq "on" && $cb_tags =~ /notify_private/))
- {
- # Pre bug #29618 (0.3.3) away detect
- if (weechat::info_get("version_number", "") <= 197120)
- {
- $away = '';
- # Get infolist for this server
- $infolist = weechat::infolist_get("irc_server", "", weechat::buffer_get_string($cb_bufferp, "localvar_server"));
- while (weechat::infolist_next($infolist))
- {
- # Get away message is is_away is on
- $away = weechat::infolist_string($infolist, "away_message") if (weechat::infolist_integer($infolist, "is_away"));
- }
- weechat::infolist_free($infolist);
- }
- # Post bug #29618 fix
- else
- {
- $away = weechat::buffer_get_string($cb_bufferp, "localvar_away");
- }
- if (weechat::config_get_plugin("away_only") ne "on" || ($away ne ""))
- {
- # Check buffer name is an IRC channel
- $bufname = weechat::buffer_get_string($cb_bufferp, 'name');
- if ($bufname =~ /(.*)\.([#&\+!])(.*)/)
- {
- # Are we running on this channel
- if (weechat::config_get_plugin($bufname) ne "off" && $cb_disp eq "1")
- {
- # Format nick
- # Line isn't action or topic notify
- if (!($cb_tags =~ /irc_action/) && !($cb_tags =~ /irc_topic/))
- {
- # Strip nick colour
- $uncolnick = weechat::string_remove_color($cb_prefix, "");
- # Format nick
- $nick = " ".weechat::config_get_plugin("nick_prefix").weechat::color("chat_highlight").$uncolnick.weechat::color("reset").weechat::config_get_plugin("nick_suffix");
- }
- # Topic line
- elsif ($cb_tags =~ /irc_topic/)
- {
- $nick = " ".$cb_prefix.weechat::color("reset");
- }
- # Action line
- else
- {
- $uncolnick = weechat::string_remove_color($cb_prefix, "");
- $nick = weechat::color("chat_highlight").$uncolnick.weechat::color("reset");
- }
- # Send to output
- highmon_print ($cb_msg, $cb_bufferp, $nick, $cb_date, $cb_tags);
- }
- }
- # Or is private message
- elsif (weechat::config_get_plugin("merge_private") eq "on" && $cb_tags =~ /notify_private/)
- {
- # Strip nick colour
- $uncolnick = weechat::buffer_get_string($cb_bufferp, 'short_name');
- # Format nick
- $nick = " ".weechat::config_get_plugin("nick_prefix").weechat::color("chat_highlight").$uncolnick.weechat::color("reset").weechat::config_get_plugin("nick_suffix");
- #Send to output
- highmon_print ($cb_msg, $cb_bufferp, $nick, $cb_date, $cb_tags);
- }
- }
- }
- return weechat::WEECHAT_RC_OK;
-}
-
-# Output formatter and printer takes (msg bufpointer nick)
-sub highmon_print
-{
- $cb_msg = $_[0];
- my $cb_bufferp = $_[1] if ($_[1]);
- my $nick = $_[2] if ($_[2]);
- my $cb_date = $_[3] if ($_[3]);
- my $cb_tags = $_[4] if ($_[4]);
-
- #Normal channel message
- if ($cb_bufferp && $nick)
- {
- # Format buffer name
- $bufname = format_buffer_name($cb_bufferp);
-
- # If alignment is #channel | nick msg
- if (weechat::config_get_plugin("alignment") eq "channel")
- {
- $nick =~ s/\s(.*)/$1/;
- # Build string
- $outstr = $bufname."\t".$nick." ".$cb_msg;
- }
- # or if it is channel number | nick msg
- elsif (weechat::config_get_plugin("alignment") eq "schannel")
- {
- $nick =~ s/\s(.*)/$1/;
- # Use channel number instead
- $bufname = weechat::color("chat_prefix_buffer").weechat::buffer_get_integer($cb_bufferp, 'number').weechat::color("reset");
- # Build string
- $outstr = $bufname."\t".$nick." ".$cb_msg;
- }
- # or if it is number:#channel | nick msg
- elsif (weechat::config_get_plugin("alignment") eq "nchannel")
- {
- $nick =~ s/\s(.*)/$1/;
- # Place channel number in front of formatted name
- $bufname = weechat::color("chat_prefix_buffer").weechat::buffer_get_integer($cb_bufferp, 'number').":".weechat::color("reset").$bufname;
- # Build string
- $outstr = $bufname."\t".$nick." ".$cb_msg;
- }
- # or if it is #channel nick | msg
- elsif (weechat::config_get_plugin("alignment") eq "channel,nick")
- {
- # Build string
- $outstr = $bufname.":".$nick."\t".$cb_msg;
- }
- # or if it is channel number nick | msg
- elsif (weechat::config_get_plugin("alignment") eq "schannel,nick")
- {
- # Use channel number instead
- $bufname = weechat::color("chat_prefix_buffer").weechat::buffer_get_integer($cb_bufferp, 'number').weechat::color("reset");
- # Build string
- $outstr = $bufname.":".$nick."\t".$cb_msg;
- }
- # or if it is number:#channel nick | msg
- elsif (weechat::config_get_plugin("alignment") eq "nchannel,nick")
- {
- # Place channel number in front of formatted name
- $bufname = weechat::color("chat_prefix_buffer").weechat::buffer_get_integer($cb_bufferp, 'number').":".weechat::color("reset").$bufname;
- # Build string
- $outstr = $bufname.":".$nick."\t".$cb_msg;
- }
- # or finally | #channel nick msg
- else
- {
- # Build string
- $outstr = "\t".$bufname.":".$nick." ".$cb_msg;
- }
- }
- # highmon channel toggle message
- elsif ($cb_bufferp && !$nick)
- {
- # Format buffer name
- $bufname = format_buffer_name($cb_bufferp);
-
- # If alignment is #channel * | *
- if (weechat::config_get_plugin("alignment") =~ /channel/)
- {
- # If it's actually channel number * | *
- if (weechat::config_get_plugin("alignment") =~ /schannel/)
- {
- # Use channel number instead
- $bufname = weechat::color("chat_prefix_buffer").weechat::buffer_get_integer($cb_bufferp, 'number').weechat::color("reset");
- }
- # Or if it's actually number:#channel * | *
- if (weechat::config_get_plugin("alignment") =~ /nchannel/)
- {
- # Place channel number in front of formatted name
- $bufname = weechat::color("chat_prefix_buffer").weechat::buffer_get_integer($cb_bufferp, 'number').":".weechat::color("reset").$bufname;
- }
- $outstr = $bufname."\t".$cb_msg;
- }
- # or if alignment is | *
- else
- {
- $outstr = $bufname.": ".$cb_msg;
- }
- }
- # highmon dynmon
- elsif (!$cb_bufferp && !$nick)
- {
- $outstr = "\t".$cb_msg;
- }
-
- # Send string to buffer
- if (weechat::config_get_plugin("output") eq "buffer")
- {
- # Search for and confirm buffer
- $highmon_buffer = weechat::buffer_search("perl", "highmon");
- # Print
- if ($cb_date)
- {
- weechat::print_date_tags($highmon_buffer, $cb_date, $cb_tags, $outstr);
- }
- else
- {
- weechat::print($highmon_buffer, $outstr);
- }
- }
- elsif (weechat::config_get_plugin("output") eq "bar")
- {
- # Add time string
- use POSIX qw(strftime);
- if ($cb_date)
- {
- $time = strftime(weechat::config_string(weechat::config_get("weechat.look.buffer_time_format")), localtime($cb_date));
- }
- else
- {
- $time = strftime(weechat::config_string(weechat::config_get("weechat.look.buffer_time_format")), localtime);
- }
- # Colourise
- if ($time =~ /\$\{(?:color:)?[\w,]+\}/) # Coloured string
- {
- while ($time =~ /\$\{(?:color:)?([\w,]+)\}/)
- {
- $color = weechat::color($1);
- $time =~ s/\$\{(?:color:)?[\w,]+\}/$color/;
- }
- $time .= weechat::color("reset");
- }
- else # Default string
- {
- $colour = weechat::color(weechat::config_string(weechat::config_get("weechat.color.chat_time_delimiters")));
- $reset = weechat::color("reset");
- $time =~ s/(\d*)(.)(\d*)/$1$colour$2$reset$3/g;
- }
- # Push updates to bar lists
- push (@bar_lines_time, $time);
-
- # Change tab char
- $delim = " ".weechat::color(weechat::config_string(weechat::config_get("weechat.color.chat_delimiters"))).weechat::config_string(weechat::config_get("weechat.look.prefix_suffix")).weechat::color("reset")." ";
- $outstr =~ s/\t/$delim/;
-
- push (@bar_lines, $outstr);
- # Trigger update
- weechat::bar_item_update("highmon");
-
- if (weechat::config_get_plugin("bar_scrolldown") eq "on")
- {
- weechat::command("", "/bar scroll highmon * ye")
- }
- }
-}
-
-# Start the output display
-sub highmon_start
-{
- if (weechat::config_get_plugin("output") eq "buffer")
- {
- highmon_buffer_open();
- }
- elsif (weechat::config_get_plugin("output") eq "bar")
- {
- highmon_bar_open();
- }
-}
-
-# Takes two optional args (channel server), toggles monitoring on/off
-sub highmon_toggle
-{
- $data = $_[0];
- $buffer = $_[1];
- $args = $_[2];
-
- # Check if we've been told what channel to act on
- if ($args ne "")
- {
- # Split argument up
- @arg_array = split(/ /,$args);
- # Check if a server was given
- if ($arg_array[1])
- {
- # Find matching
- $bufp = weechat::buffer_search("irc", $arg_array[1].".".$arg_array[0]);
- }
- else
- {
- $found_chans = 0;
- # Loop through defined servers
- $infolist = weechat::infolist_get("buffer", "", "");
- while (weechat::infolist_next($infolist))
- {
- # Only interesting in IRC buffers
- if (weechat::infolist_string($infolist, "plugin_name") eq "irc")
- {
- # Find buffers that maych
- $sname = weechat::infolist_string($infolist, "short_name");
- if ($sname eq $arg_array[0])
- {
- $found_chans++;
- $bufp = weechat::infolist_pointer($infolist, "pointer");
- }
- }
- }
- weechat::infolist_free($infolist);
- # If the infolist found more than one channel, halt as we need to know which one
- if ($found_chans > 1)
- {
- weechat::print("", "Channel name is not unique, please define server");
- return weechat::WEECHAT_RC_OK;
- }
- }
- # Something didn't return right
- if ($bufp eq "")
- {
- weechat::print("", "Could not find buffer");
- return weechat::WEECHAT_RC_OK;
- }
- }
- else
- {
- # Get pointer from where we are
- $bufp = weechat::current_buffer();
- }
- # Get buffer name
- $bufname = weechat::buffer_get_string($bufp, 'name');
- # Test if buffer is an IRC channel
- if ($bufname =~ /(.*)\.([#&\+!])(.*)/)
- {
- if (weechat::config_get_plugin($bufname) eq "off")
- {
- # If currently off, set on
- weechat::config_set_plugin($bufname, "on");
-
- # Send to output formatter
- highmon_print("Highlight Monitoring Enabled", $bufp);
- return weechat::WEECHAT_RC_OK;
- }
- elsif (weechat::config_get_plugin($bufname) eq "on" || weechat::config_get_plugin($bufname) eq "")
- {
- # If currently on, set off
- weechat::config_set_plugin($bufname, "off");
-
- # Send to output formatter
- highmon_print("Highlight Monitoring Disabled", $bufp);
- return weechat::WEECHAT_RC_OK;
- }
- }
-}
-
-# Takes a buffer pointer and returns a formatted name
-sub format_buffer_name
-{
- $cb_bufferp = $_[0];
- $bufname = weechat::buffer_get_string($cb_bufferp, 'name');
-
- # Set colour from buffer name
- if (weechat::config_get_plugin("color_buf") eq "on")
- {
- # Determine what colour to use
- $color = weechat::info_get("irc_nick_color", $bufname);
- if (!$color)
- {
- $color = 0;
- @char_array = split(//,$bufname);
- foreach $char (@char_array)
- {
- $color += ord($char);
- }
- $color %= 10;
- $color = sprintf "weechat.color.chat_nick_color%02d", $color+1;
- $color = weechat::config_get($color);
- $color = weechat::config_string($color);
- $color = weechat::color($color);
- }
-
- # Private message just show network
- if (weechat::config_get_plugin("merge_private") eq "on" && weechat::buffer_get_string($cb_bufferp, "localvar_type") eq "private")
- {
- $bufname = weechat::buffer_get_string($cb_bufferp, "localvar_server");
- }
- # Format name to short or 'nicename'
- elsif (weechat::config_get_plugin("short_names") eq "on")
- {
- $bufname = weechat::buffer_get_string($cb_bufferp, 'short_name');
- }
- else
- {
- $bufname =~ s/(.*)\.([#&\+!])(.*)/$1$2$3/;
- }
-
- # Build a coloured string
- $bufname = $color.$bufname.weechat::color("reset");
- }
- # User set colour name
- elsif (weechat::config_get_plugin("color_buf") ne "off")
- {
- # Private message just show network
- if (weechat::config_get_plugin("merge_private") eq "on" && weechat::buffer_get_string($cb_bufferp, "localvar_type") eq "private")
- {
- $bufname = weechat::buffer_get_string($cb_bufferp, "localvar_server");
- }
- # Format name to short or 'nicename'
- elsif (weechat::config_get_plugin("short_names") eq "on")
- {
- $bufname = weechat::buffer_get_string($cb_bufferp, 'short_name');
- }
- else
- {
- $bufname =~ s/(.*)\.([#&\+!])(.*)/$1$2$3/;
- }
-
- $color = weechat::config_get_plugin("color_buf");
- $bufname = weechat::color($color).$bufname.weechat::color("reset");
- }
- # Stick with default colour
- else
- {
- # Private message just show network
- if (weechat::config_get_plugin("merge_private") eq "on" && weechat::buffer_get_string($cb_bufferp, "localvar_type") eq "private")
- {
- $bufname = weechat::buffer_get_string($cb_bufferp, "localvar_server");
- }
- # Format name to short or 'nicename'
- elsif (weechat::config_get_plugin("short_names") eq "on")
- {
- $bufname = weechat::buffer_get_string($cb_bufferp, 'short_name');
- }
- else
- {
- $bufname =~ s/(.*)\.([#&\+!])(.*)/$1$2$3/;
- }
- }
-
- return $bufname;
-}
-
-# Check result of register, and attempt to behave in a sane manner
-if (!weechat::register("highmon", "KenjiE20", "2.5", "GPL3", "Highlight Monitor", "", ""))
-{
- # Double load
- weechat::print ("", "\tHighmon is already loaded");
- return weechat::WEECHAT_RC_OK;
-}
-else
-{
- # Start everything
- highmon_hook();
- highmon_config_init();
- highmon_start();
-}
diff --git a/.weechat/perl/iset.pl b/.weechat/perl/iset.pl
deleted file mode 100644
index 163dfb5e..00000000
--- a/.weechat/perl/iset.pl
+++ /dev/null
@@ -1,1624 +0,0 @@
-#
-# Copyright (C) 2008-2014 Sebastien Helleu <flashcode@flashtux.org>
-# Copyright (C) 2010-2015 Nils Görs <weechatter@arcor.de>
-#
-# This program is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 3 of the License, or
-# (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program. If not, see <http://www.gnu.org/licenses/>.
-#
-# Set WeeChat and plugins options interactively.
-#
-# History:
-#
-# 2016-07-08, nils_2 <weechatter@arcor.de>
-# version 4.2: add diff function
-# 2016-02-06, Sebastien Helleu <flashcode@flashtux.org>:
-# version 4.1: remove debug print
-# 2015-12-24, Sebastien Helleu <flashcode@flashtux.org>:
-# version 4.0: add support of parent options (inherited values in irc servers)
-# with WeeChat >= 1.4
-# 2015-05-16, Sebastien Helleu <flashcode@flashtux.org>:
-# version 3.9: fix cursor position when editing an option with WeeChat >= 1.2
-# 2015-05-02, arza <arza@arza.us>:
-# version 3.8: don't append "null" to /set when setting an undefined setting
-# 2015-05-01, nils_2 <weechatter@arcor.de>:
-# version 3.7: fix two perl warnings (reported by t3chguy)
-# 2014-09-30, arza <arza@arza.us>:
-# version 3.6: fix current line counter when options aren't found
-# 2014-06-03, nils_2 <weechatter@arcor.de>:
-# version 3.5: add new option "use_mute"
-# 2014-01-30, stfn <stfnmd@gmail.com>:
-# version 3.4: add new options "color_value_diff" and "color_value_diff_selected"
-# 2014-01-16, luz <ne.tetewi@gmail.com>:
-# version 3.3: fix bug with column alignment in iset buffer when option
-# name contains unicode characters
-# 2013-08-03, Sebastien Helleu <flashcode@flashtux.org>:
-# version 3.2: allow "q" as input in iset buffer to close it
-# 2013-07-14, Sebastien Helleu <flashcode@flashtux.org>:
-# version 3.1: remove unneeded calls to iset_refresh() in mouse callback
-# (faster mouse actions when lot of options are displayed),
-# fix bug when clicking on a line after the last option displayed
-# 2013-04-30, arza <arza@arza.us>:
-# version 3.0: simpler title, fix refresh on unset
-# 2012-12-16, nils_2 <weechatter@arcor.de>:
-# version 2.9: fix focus window with iset buffer on mouse click
-# 2012-08-25, nils_2 <weechatter@arcor.de>:
-# version 2.8: most important key and mouse bindings for iset buffer added to title-bar (idea The-Compiler)
-# 2012-07-31, nils_2 <weechatter@arcor.de>:
-# version 2.7: add combined option and value search (see /help iset)
-# : add exact value search (see /help iset)
-# : fix problem with metacharacter in value search
-# : fix use of uninitialized value for unset option and reset value of option
-# 2012-07-25, nils_2 <weechatter@arcor.de>:
-# version 2.6: switch to iset buffer (if existing) when command /iset is called with arguments
-# 2012-03-17, Sebastien Helleu <flashcode@flashtux.org>:
-# version 2.5: fix check of sections when creating config file
-# 2012-03-09, Sebastien Helleu <flashcode@flashtux.org>:
-# version 2.4: fix reload of config file
-# 2012-02-02, nils_2 <weechatter@arcor.de>:
-# version 2.3: fixed: refresh problem with new search results and cursor was outside window.
-# : add: new option "current_line" in title bar
-# version 2.2: fixed: refresh error when toggling plugins description
-# 2011-11-05, nils_2 <weechatter@arcor.de>:
-# version 2.1: use own config file (iset.conf), fix own help color (used immediately)
-# 2011-10-16, nils_2 <weechatter@arcor.de>:
-# version 2.0: add support for left-mouse-button and more sensitive mouse gesture (for integer/color options)
-# add help text for mouse support
-# 2011-09-20, Sebastien Helleu <flashcode@flashtux.org>:
-# version 1.9: add mouse support, fix iset buffer, fix errors on first load under FreeBSD
-# 2011-07-21, nils_2 <weechatter@arcor.de>:
-# version 1.8: added: option "show_plugin_description" (alt+p)
-# fixed: typos in /help iset (lower case for alt+'x' keys)
-# 2011-05-29, nils_2 <weechatter@arcor.de>:
-# version 1.7: added: version check for future needs
-# added: new option (scroll_horiz) and usage of scroll_horiz function (weechat >= 0.3.6 required)
-# fixed: help_bar did not pop up immediately using key-shortcut
-# 2011-02-19, nils_2 <weechatter@arcor.de>:
-# version 1.6: added: display of all possible values in help bar (show_help_extra_info)
-# fixed: external user options never loaded when starting iset first time
-# 2011-02-13, Sebastien Helleu <flashcode@flashtux.org>:
-# version 1.5: use new help format for command arguments
-# 2011-02-03, nils_2 <weechatter@arcor.de>:
-# version 1.4: fixed: restore value filter after /upgrade using buffer local variable.
-# 2011-01-14, nils_2 <weechatter@arcor.de>:
-# version 1.3: added function to search for values (option value_search_char).
-# code optimization.
-# 2010-12-26, Sebastien Helleu <flashcode@flashtux.org>:
-# version 1.2: improve speed of /upgrade when iset buffer is open,
-# restore filter used after /upgrade using buffer local variable,
-# use /iset filter argument if buffer is open.
-# 2010-11-21, drubin <drubin+weechat@smartcube.co.za>:
-# version 1.1.1: fix bugs with cursor position
-# 2010-11-20, nils_2 <weechatter@arcor.de>:
-# version 1.1: cursor position set to value
-# 2010-08-03, Sebastien Helleu <flashcode@flashtux.org>:
-# version 1.0: move misplaced call to infolist_free()
-# 2010-02-02, rettub <rettub@gmx.net>:
-# version 0.9: turn all the help stuff off if option 'show_help_bar' is 'off',
-# new key binding <alt>-<v> to toggle help_bar and help stuff on/off
-# 2010-01-30, nils_2 <weechatter@arcor.de>:
-# version 0.8: fix error when option does not exist
-# 2010-01-24, Sebastien Helleu <flashcode@flashtux.org>:
-# version 0.7: display iset bar only on iset buffer
-# 2010-01-22, nils_2 <weechatter@arcor.de> and drubin:
-# version 0.6: add description in a bar, fix singular/plural bug in title bar,
-# fix selected line when switching buffer
-# 2009-06-21, Sebastien Helleu <flashcode@flashtux.org>:
-# version 0.5: fix bug with iset buffer after /upgrade
-# 2009-05-02, Sebastien Helleu <flashcode@flashtux.org>:
-# version 0.4: sync with last API changes
-# 2009-01-04, Sebastien Helleu <flashcode@flashtux.org>:
-# version 0.3: open iset buffer when /iset command is executed
-# 2009-01-04, Sebastien Helleu <flashcode@flashtux.org>:
-# version 0.2: use null values for options, add colors, fix refresh bugs,
-# use new keys to reset/unset options, sort options by name,
-# display number of options in buffer's title
-# 2008-11-05, Sebastien Helleu <flashcode@flashtux.org>:
-# version 0.1: first official version
-# 2008-04-19, Sebastien Helleu <flashcode@flashtux.org>:
-# script creation
-
-use strict;
-
-my $PRGNAME = "iset";
-my $VERSION = "4.2";
-my $DESCR = "Interactive Set for configuration options";
-my $AUTHOR = "Sebastien Helleu <flashcode\@flashtux.org>";
-my $LICENSE = "GPL3";
-my $LANG = "perl";
-my $ISET_CONFIG_FILE_NAME = "iset";
-
-my $iset_config_file;
-my $iset_buffer = "";
-my $wee_version_number = 0;
-my @iset_focus = ();
-my @options_names = ();
-my @options_parent_names = ();
-my @options_types = ();
-my @options_values = ();
-my @options_default_values = ();
-my @options_parent_values = ();
-my @options_is_null = ();
-my $option_max_length = 0;
-my $current_line = 0;
-my $filter = "*";
-my $description = "";
-my $options_name_copy = "";
-my $iset_filter_title = "";
-# search modes: 0 = index() on value, 1 = grep() on value, 2 = grep() on option, 3 = grep on option & value, 4 = diff all, 5 = diff parts
-my $search_mode = 2;
-my $search_value = "";
-my $help_text_keys = "alt + space: toggle, +/-: increase/decrease, enter: change, ir: reset, iu: unset, v: toggle help bar";
-my $help_text_mouse = "Mouse: left: select, right: toggle/set, right + drag left/right: increase/decrease";
-my %options_iset;
-
-my %mouse_keys = ("\@chat(perl.$PRGNAME):button1" => "hsignal:iset_mouse",
- "\@chat(perl.$PRGNAME):button2*" => "hsignal:iset_mouse",
- "\@chat(perl.$PRGNAME):wheelup" => "/repeat 5 /iset **up",
- "\@chat(perl.$PRGNAME):wheeldown" => "/repeat 5 /iset **down");
-
-
-sub iset_title
-{
- if ($iset_buffer ne "")
- {
- my $current_line_counter = "";
- if (weechat::config_boolean($options_iset{"show_current_line"}) == 1)
- {
- if (@options_names eq 0)
- {
- $current_line_counter = "0/";
- }
- else
- {
- $current_line_counter = ($current_line + 1) . "/";
- }
- }
- my $show_filter = "";
- if ($search_mode eq 0)
- {
- $iset_filter_title = "(value) ";
- $show_filter = $search_value;
- if ( substr($show_filter,0,1) eq weechat::config_string($options_iset{"value_search_char"}) )
- {
- $show_filter = substr($show_filter,1,length($show_filter));
- }
- }
- elsif ($search_mode eq 1)
- {
- $iset_filter_title = "(value) ";
- $show_filter = "*".$search_value."*";
- }
- elsif ($search_mode eq 2)
- {
- $iset_filter_title = "";
- $filter = "*" if ($filter eq "");
- $show_filter = $filter;
- }
- elsif ($search_mode == 4 or $search_mode == 5)
- {
- $iset_filter_title = "diff: ";
- $show_filter = "all";
- $show_filter = $search_value if $search_mode == 5;
- }
- elsif ($search_mode eq 3)
- {
- $iset_filter_title = "(option) ";
- $show_filter = $filter
- .weechat::color("default")
- ." / (value) "
- .weechat::color("yellow")
- ."*".$search_value."*";
- }
- weechat::buffer_set($iset_buffer, "title",
- $iset_filter_title
- .weechat::color("yellow")
- .$show_filter
- .weechat::color("default")." | "
- .$current_line_counter
- .@options_names
- ." | "
- .$help_text_keys
- ." | "
- .$help_text_mouse);
- }
-}
-
-sub iset_create_filter
-{
- $filter = $_[0];
- if ( $search_mode == 3 )
- {
- my @cmd_array = split(/ /,$filter);
- my $array_count = @cmd_array;
- $filter = $cmd_array[0];
- $filter = $cmd_array[0] . " " . $cmd_array[1] if ( $array_count >2 );
- }
- $filter = "$1.*" if ($filter =~ /f (.*)/); # search file
- $filter = "*.$1.*" if ($filter =~ /s (.*)/); # search section
- if ((substr($filter, 0, 1) ne "*") && (substr($filter, -1, 1) ne "*"))
- {
- $filter = "*".$filter."*";
- }
- if ($iset_buffer ne "")
- {
- weechat::buffer_set($iset_buffer, "localvar_set_iset_filter", $filter);
- }
-}
-
-sub iset_buffer_input
-{
- my ($data, $buffer, $string) = ($_[0], $_[1], $_[2]);
-
- # string begins with space?
- return weechat::WEECHAT_RC_OK if (substr($string, 0, 1 ) eq " ");
-
- if ($string eq "q")
- {
- weechat::buffer_close($buffer);
- return weechat::WEECHAT_RC_OK;
- }
- $search_value = "";
- my @cmd_array = split(/ /,$string);
- my $array_count = @cmd_array;
- my $string2 = substr($string, 0, 1);
- if ($string2 eq weechat::config_string($options_iset{"value_search_char"})
- or (defined $cmd_array[0] and $cmd_array[0] eq weechat::config_string($options_iset{"value_search_char"}).weechat::config_string($options_iset{"value_search_char"})) )
- {
- $search_mode = 1;
- $search_value = substr($string, 1);
- iset_get_values($search_value);
- if ($iset_buffer ne "")
- {
- weechat::buffer_set($iset_buffer, "localvar_set_iset_search_value", $search_value);
- }
- }
- # show all diff values
- elsif ($string eq "d")
- {
- $search_mode = 4;
-# iset_title();
- iset_create_filter("*");
- iset_get_options("*");
- }
- elsif ( $array_count >= 2 and $cmd_array[0] eq "d")
- {
- $search_mode = 5;
- $search_value = substr($cmd_array[1], 0); # cut value_search_char
- $search_value = substr($cmd_array[2], 0) if ( $array_count > 2); # cut value_search_char
- iset_create_filter($search_value);
- iset_get_options($search_value);
-
- }
- else
- {
- $search_mode = 2;
- if ( $array_count >= 2 and $cmd_array[0] ne "f" or $cmd_array[0] ne "s" )
- {
- if ( defined $cmd_array[1] and substr($cmd_array[1], 0, 1) eq weechat::config_string($options_iset{"value_search_char"})
- or defined $cmd_array[2] and substr($cmd_array[2], 0, 1) eq weechat::config_string($options_iset{"value_search_char"}) )
- {
- $search_mode = 3;
- $search_value = substr($cmd_array[1], 1); # cut value_search_char
- $search_value = substr($cmd_array[2], 1) if ( $array_count > 2); # cut value_search_char
- }
- }
- if ( $search_mode == 3)
- {
- iset_create_filter($string);
- iset_get_options($search_value);
- }
- else
- {
- iset_create_filter($string);
- iset_get_options("");
- }
- }
- weechat::buffer_set($iset_buffer, "localvar_set_iset_search_mode", $search_mode);
- weechat::buffer_clear($buffer);
- $current_line = 0;
- iset_refresh();
- return weechat::WEECHAT_RC_OK;
-}
-
-sub iset_buffer_close
-{
- $iset_buffer = "";
-
- return weechat::WEECHAT_RC_OK;
-}
-
-sub iset_init
-{
- $current_line = 0;
- $iset_buffer = weechat::buffer_search($LANG, $PRGNAME);
- if ($iset_buffer eq "")
- {
- $iset_buffer = weechat::buffer_new($PRGNAME, "iset_buffer_input", "", "iset_buffer_close", "");
- }
- else
- {
- my $new_filter = weechat::buffer_get_string($iset_buffer, "localvar_iset_filter");
- $search_mode = weechat::buffer_get_string($iset_buffer, "localvar_iset_search_mode");
- $search_value = weechat::buffer_get_string($iset_buffer, "localvar_iset_search_value");
- $filter = $new_filter if ($new_filter ne "");
- }
- if ($iset_buffer ne "")
- {
- weechat::buffer_set($iset_buffer, "type", "free");
- iset_title();
- weechat::buffer_set($iset_buffer, "key_bind_ctrl-L", "/iset **refresh");
- weechat::buffer_set($iset_buffer, "key_bind_meta2-A", "/iset **up");
- weechat::buffer_set($iset_buffer, "key_bind_meta2-B", "/iset **down");
- weechat::buffer_set($iset_buffer, "key_bind_meta2-23~", "/iset **left");
- weechat::buffer_set($iset_buffer, "key_bind_meta2-24~" , "/iset **right");
- weechat::buffer_set($iset_buffer, "key_bind_meta- ", "/iset **toggle");
- weechat::buffer_set($iset_buffer, "key_bind_meta-+", "/iset **incr");
- weechat::buffer_set($iset_buffer, "key_bind_meta--", "/iset **decr");
- weechat::buffer_set($iset_buffer, "key_bind_meta-imeta-r", "/iset **reset");
- weechat::buffer_set($iset_buffer, "key_bind_meta-imeta-u", "/iset **unset");
- weechat::buffer_set($iset_buffer, "key_bind_meta-ctrl-J", "/iset **set");
- weechat::buffer_set($iset_buffer, "key_bind_meta-ctrl-M", "/iset **set");
- weechat::buffer_set($iset_buffer, "key_bind_meta-meta2-1~", "/iset **scroll_top");
- weechat::buffer_set($iset_buffer, "key_bind_meta-meta2-4~", "/iset **scroll_bottom");
- weechat::buffer_set($iset_buffer, "key_bind_meta-v", "/iset **toggle_help");
- weechat::buffer_set($iset_buffer, "key_bind_meta-p", "/iset **toggle_show_plugin_desc");
- weechat::buffer_set($iset_buffer, "localvar_set_iset_filter", $filter);
- weechat::buffer_set($iset_buffer, "localvar_set_iset_search_mode", $search_mode);
- weechat::buffer_set($iset_buffer, "localvar_set_iset_search_value", $search_value);
- }
-}
-
-sub iset_get_options
-{
- my $var_value = $_[0];
- $var_value = "" if (not defined $var_value);
- $var_value = lc($var_value);
- $search_value = $var_value;
- @iset_focus = ();
- @options_names = ();
- @options_parent_names = ();
- @options_types = ();
- @options_values = ();
- @options_default_values = ();
- @options_parent_values = ();
- @options_is_null = ();
- $option_max_length = 0;
- my %options_internal = ();
- my $i = 0;
- my $key;
- my $iset_struct;
- my %iset_struct;
-
- weechat::buffer_set($iset_buffer, "localvar_set_iset_search_value", $var_value) if ($search_mode == 3);
-
- my $infolist = weechat::infolist_get("option", "", $filter);
- while (weechat::infolist_next($infolist))
- {
- $key = sprintf("%08d", $i);
- my $name = weechat::infolist_string($infolist, "full_name");
- my $parent_name = weechat::infolist_string($infolist, "parent_name");
- next if (weechat::config_boolean($options_iset{"show_plugin_description"}) == 0 and index ($name, "plugins.desc.") != -1);
- my $type = weechat::infolist_string($infolist, "type");
- my $value = weechat::infolist_string($infolist, "value");
- my $default_value = weechat::infolist_string($infolist, "default_value");
- my $parent_value;
- if ($parent_name && (($wee_version_number < 0x00040300) || (weechat::infolist_search_var($infolist, "parent_value"))))
- {
- $parent_value = weechat::infolist_string($infolist, "parent_value");
- }
- my $is_null = weechat::infolist_integer($infolist, "value_is_null");
-
- if ($search_mode == 3)
- {
- my $value = weechat::infolist_string($infolist, "value");
- if ( grep /\Q$var_value/,lc($value) )
- {
- $options_internal{$name}{"parent_name"} = $parent_name;
- $options_internal{$name}{"type"} = $type;
- $options_internal{$name}{"value"} = $value;
- $options_internal{$name}{"default_value"} = $default_value;
- $options_internal{$name}{"parent_value"} = $parent_value;
- $options_internal{$name}{"is_null"} = $is_null;
- $option_max_length = length($name) if (length($name) > $option_max_length);
- $iset_struct{$key} = $options_internal{$name};
- push(@iset_focus, $iset_struct{$key});
- }
- }
- # search for diff?
- elsif ( $search_mode == 4 or $search_mode == 5)
- {
- if ($value ne $default_value )
- {
- $options_internal{$name}{"parent_name"} = $parent_name;
- $options_internal{$name}{"type"} = $type;
- $options_internal{$name}{"value"} = $value;
- $options_internal{$name}{"default_value"} = $default_value;
- $options_internal{$name}{"parent_value"} = $parent_value;
- $options_internal{$name}{"is_null"} = $is_null;
- $option_max_length = length($name) if (length($name) > $option_max_length);
- $iset_struct{$key} = $options_internal{$name};
- push(@iset_focus, $iset_struct{$key});
- }
- }
- else
- {
- $options_internal{$name}{"parent_name"} = $parent_name;
- $options_internal{$name}{"type"} = $type;
- $options_internal{$name}{"value"} = $value;
- $options_internal{$name}{"default_value"} = $default_value;
- $options_internal{$name}{"parent_value"} = $parent_value;
- $options_internal{$name}{"is_null"} = $is_null;
- $option_max_length = length($name) if (length($name) > $option_max_length);
- $iset_struct{$key} = $options_internal{$name};
- push(@iset_focus, $iset_struct{$key});
- }
- $i++;
- }
- weechat::infolist_free($infolist);
-
- foreach my $name (sort keys %options_internal)
- {
- push(@options_names, $name);
- push(@options_parent_names, $options_internal{$name}{"parent_name"});
- push(@options_types, $options_internal{$name}{"type"});
- push(@options_values, $options_internal{$name}{"value"});
- push(@options_default_values, $options_internal{$name}{"default_value"});
- push(@options_parent_values, $options_internal{$name}{"parent_value"});
- push(@options_is_null, $options_internal{$name}{"is_null"});
- }
-}
-
-sub iset_get_values
-{
- my $var_value = $_[0];
- $var_value = lc($var_value);
- if (substr($var_value,0,1) eq weechat::config_string($options_iset{"value_search_char"}) and $var_value ne weechat::config_string($options_iset{"value_search_char"}))
- {
- $var_value = substr($var_value,1,length($var_value));
- $search_mode = 0;
- }
- iset_search_values($var_value,$search_mode);
- weechat::buffer_set($iset_buffer, "localvar_set_iset_search_mode", $search_mode);
- weechat::buffer_set($iset_buffer, "localvar_set_iset_search_value", $var_value);
- $search_value = $var_value;
-}
-sub iset_search_values
-{
- my ($var_value,$search_mode) = ($_[0],$_[1]);
- @options_names = ();
- @options_parent_names = ();
- @options_types = ();
- @options_values = ();
- @options_default_values = ();
- @options_parent_values = ();
- @options_is_null = ();
- $option_max_length = 0;
- my %options_internal = ();
- my $i = 0;
- my $infolist = weechat::infolist_get("option", "", "*");
- while (weechat::infolist_next($infolist))
- {
- my $name = weechat::infolist_string($infolist, "full_name");
- my $parent_name = weechat::infolist_string($infolist, "parent_name");
- next if (weechat::config_boolean($options_iset{"show_plugin_description"}) == 0 and index ($name, "plugins.desc.") != -1);
- my $type = weechat::infolist_string($infolist, "type");
- my $is_null = weechat::infolist_integer($infolist, "value_is_null");
- my $value = weechat::infolist_string($infolist, "value");
- my $default_value = weechat::infolist_string($infolist, "default_value");
- my $parent_value;
- if ($parent_name && (($wee_version_number < 0x00040300) || (weechat::infolist_search_var($infolist, "parent_value"))))
- {
- $parent_value = weechat::infolist_string($infolist, "parent_value");
- }
- if ($search_mode)
- {
- if ( grep /\Q$var_value/,lc($value) )
- {
- $options_internal{$name}{"parent_name"} = $parent_name;
- $options_internal{$name}{"type"} = $type;
- $options_internal{$name}{"value"} = $value;
- $options_internal{$name}{"default_value"} = $default_value;
- $options_internal{$name}{"parent_value"} = $parent_value;
- $options_internal{$name}{"is_null"} = $is_null;
- $option_max_length = length($name) if (length($name) > $option_max_length);
- }
- }
- else
- {
-# if ($value =~ /\Q$var_value/si)
- if (lc($value) eq $var_value)
- {
- $options_internal{$name}{"parent_name"} = $parent_name;
- $options_internal{$name}{"type"} = $type;
- $options_internal{$name}{"value"} = $value;
- $options_internal{$name}{"default_value"} = $default_value;
- $options_internal{$name}{"parent_value"} = $parent_value;
- $options_internal{$name}{"is_null"} = $is_null;
- $option_max_length = length($name) if (length($name) > $option_max_length);
- }
- }
- $i++;
- }
- weechat::infolist_free($infolist);
- foreach my $name (sort keys %options_internal)
- {
- push(@options_names, $name);
- push(@options_parent_names, $options_internal{$name}{"parent_name"});
- push(@options_types, $options_internal{$name}{"type"});
- push(@options_values, $options_internal{$name}{"value"});
- push(@options_default_values, $options_internal{$name}{"default_value"});
- push(@options_parent_values, $options_internal{$name}{"parent_value"});
- push(@options_is_null, $options_internal{$name}{"is_null"});
- }
-}
-
-sub iset_refresh_line
-{
- if ($iset_buffer ne "")
- {
- my $y = $_[0];
- if ($y <= $#options_names)
- {
- return if (! defined($options_types[$y]));
- my $format = sprintf("%%s%%s%%s %%s %%-7s %%s %%s%%s%%s");
- my $padding;
- if ($wee_version_number >= 0x00040200)
- {
- $padding = " " x ($option_max_length - weechat::strlen_screen($options_names[$y]));
- }
- else
- {
- $padding = " " x ($option_max_length - length($options_names[$y]));
- }
- my $around = "";
- $around = "\"" if ((!$options_is_null[$y]) && ($options_types[$y] eq "string"));
-
- my $color1 = weechat::color(weechat::config_color($options_iset{"color_option"}));
- my $color2 = weechat::color(weechat::config_color($options_iset{"color_type"}));
- my $color3 = "";
- my $color4 = "";
- if ($options_is_null[$y])
- {
- $color3 = weechat::color(weechat::config_color($options_iset{"color_value_undef"}));
- $color4 = weechat::color(weechat::config_color($options_iset{"color_value"}));
- }
- elsif ($options_values[$y] ne $options_default_values[$y])
- {
- $color3 = weechat::color(weechat::config_color($options_iset{"color_value_diff"}));
- }
- else
- {
- $color3 = weechat::color(weechat::config_color($options_iset{"color_value"}));
- }
- if ($y == $current_line)
- {
- $color1 = weechat::color(weechat::config_color($options_iset{"color_option_selected"}).",".weechat::config_color($options_iset{"color_bg_selected"}));
- $color2 = weechat::color(weechat::config_color($options_iset{"color_type_selected"}).",".weechat::config_color($options_iset{"color_bg_selected"}));
- if ($options_is_null[$y])
- {
- $color3 = weechat::color(weechat::config_color($options_iset{"color_value_undef_selected"}).",".weechat::config_color($options_iset{"color_bg_selected"}));
- $color4 = weechat::color(weechat::config_color($options_iset{"color_value_selected"}).",".weechat::config_color($options_iset{"color_bg_selected"}));
- }
- elsif ($options_values[$y] ne $options_default_values[$y])
- {
- $color3 = weechat::color(weechat::config_color($options_iset{"color_value_diff_selected"}).",".weechat::config_color($options_iset{"color_bg_selected"}));
- }
- else
- {
- $color3 = weechat::color(weechat::config_color($options_iset{"color_value_selected"}).",".weechat::config_color($options_iset{"color_bg_selected"}));
- }
- }
- my $value = $options_values[$y];
- if ($options_is_null[$y])
- {
- $value = "null";
- if ($options_parent_names[$y])
- {
- if (defined $options_parent_values[$y])
- {
- my $around_parent = "";
- $around_parent = "\"" if ($options_types[$y] eq "string");
- $value .= $color1." -> ".$color4.$around_parent.$options_parent_values[$y].$around_parent;
- }
- else
- {
- $value .= $color1." -> ".$color3."null";
- }
- }
- }
- my $strline = sprintf($format,
- $color1, $options_names[$y], $padding,
- $color2, $options_types[$y],
- $color3, $around, $value, $around);
- weechat::print_y($iset_buffer, $y, $strline);
- }
- }
-}
-
-sub iset_refresh
-{
- iset_title();
- if (($iset_buffer ne "") && ($#options_names >= 0))
- {
- foreach my $y (0 .. $#options_names)
- {
- iset_refresh_line($y);
- }
- }
-
- weechat::bar_item_update("isetbar_help") if (weechat::config_boolean($options_iset{"show_help_bar"}) == 1);
-}
-
-sub iset_full_refresh
-{
- $iset_buffer = weechat::buffer_search($LANG, $PRGNAME);
- if ($iset_buffer ne "")
- {
- weechat::buffer_clear($iset_buffer) unless defined $_[0]; # iset_full_refresh(1) does a full refresh without clearing buffer
- # search for "*" in $filter.
- if ($filter =~ m/\*/ and $search_mode == 2)
- {
- iset_get_options("");
- }
- else
- {
- if ($search_mode == 0)
- {
- $search_value = "=" . $search_value;
- iset_get_values($search_value);
- }
- elsif ($search_mode == 1)
- {
- iset_get_values($search_value);
- }
- elsif ($search_mode == 3)
- {
- iset_create_filter($filter);
- iset_get_options($search_value);
- }
- }
- if (weechat::config_boolean($options_iset{"show_plugin_description"}) == 1)
- {
- iset_set_current_line($current_line);
- }else
- {
- $current_line = $#options_names if ($current_line > $#options_names);
- }
- iset_refresh();
- weechat::command($iset_buffer, "/window refresh");
- }
-}
-
-sub iset_set_current_line
-{
- my $new_current_line = $_[0];
- if ($new_current_line >= 0)
- {
- my $old_current_line = $current_line;
- $current_line = $new_current_line;
- $current_line = $#options_names if ($current_line > $#options_names);
- if ($old_current_line != $current_line)
- {
- iset_refresh_line($old_current_line);
- iset_refresh_line($current_line);
- weechat::bar_item_update("isetbar_help") if (weechat::config_boolean($options_iset{"show_help_bar"}) == 1);
- }
- }
-}
-
-sub iset_signal_window_scrolled_cb
-{
- my ($data, $signal, $signal_data) = ($_[0], $_[1], $_[2]);
- if ($iset_buffer ne "")
- {
- my $infolist = weechat::infolist_get("window", $signal_data, "");
- if (weechat::infolist_next($infolist))
- {
- if (weechat::infolist_pointer($infolist, "buffer") eq $iset_buffer)
- {
- my $old_current_line = $current_line;
- my $new_current_line = $current_line;
- my $start_line_y = weechat::infolist_integer($infolist, "start_line_y");
- my $chat_height = weechat::infolist_integer($infolist, "chat_height");
- $new_current_line += $chat_height if ($new_current_line < $start_line_y);
- $new_current_line -= $chat_height if ($new_current_line >= $start_line_y + $chat_height);
- $new_current_line = $start_line_y if ($new_current_line < $start_line_y);
- $new_current_line = $start_line_y + $chat_height - 1 if ($new_current_line >= $start_line_y + $chat_height);
- iset_set_current_line($new_current_line);
- }
- }
- weechat::infolist_free($infolist);
- }
-
- return weechat::WEECHAT_RC_OK;
-}
-
-sub iset_get_window_number
-{
- if ($iset_buffer ne "")
- {
- my $window = weechat::window_search_with_buffer($iset_buffer);
- return "-window ".weechat::window_get_integer ($window, "number")." " if ($window ne "");
- }
- return "";
-}
-
-sub iset_check_line_outside_window
-{
- if ($iset_buffer ne "")
- {
- undef my $infolist;
- if ($wee_version_number >= 0x00030500)
- {
- my $window = weechat::window_search_with_buffer($iset_buffer);
- $infolist = weechat::infolist_get("window", $window, "") if $window;
- }
- else
- {
- $infolist = weechat::infolist_get("window", "", "current");
- }
- if ($infolist)
- {
- if (weechat::infolist_next($infolist))
- {
- my $start_line_y = weechat::infolist_integer($infolist, "start_line_y");
- my $chat_height = weechat::infolist_integer($infolist, "chat_height");
- my $window_number = "";
- if ($wee_version_number >= 0x00030500)
- {
- $window_number = "-window ".weechat::infolist_integer($infolist, "number")." ";
- }
- if ($start_line_y > $current_line)
- {
- weechat::command($iset_buffer, "/window scroll ".$window_number."-".($start_line_y - $current_line));
- }
- else
- {
- if ($start_line_y <= $current_line - $chat_height)
- {
- weechat::command($iset_buffer, "/window scroll ".$window_number."+".($current_line - $start_line_y - $chat_height + 1));
-
- }
- }
- }
- weechat::infolist_free($infolist);
- }
- }
-}
-
-sub iset_get_option_name_index
-{
- my $option_name = $_[0];
- my $index = 0;
- while ($index <= $#options_names)
- {
- return -1 if ($options_names[$index] gt $option_name);
- return $index if ($options_names[$index] eq $option_name);
- $index++;
- }
- return -1;
-}
-
-sub iset_refresh_option
-{
- my $option_name = $_[0];
- my $index = $_[1];
- my $infolist = weechat::infolist_get("option", "", $option_name);
- if ($infolist)
- {
- weechat::infolist_next($infolist);
- if (weechat::infolist_fields($infolist))
- {
- $options_parent_names[$index] = weechat::infolist_string($infolist, "parent_name");
- $options_types[$index] = weechat::infolist_string($infolist, "type");
- $options_values[$index] = weechat::infolist_string($infolist, "value");
- $options_default_values[$index] = weechat::infolist_string($infolist, "default_value");
- $options_is_null[$index] = weechat::infolist_integer($infolist, "value_is_null");
- $options_parent_values[$index] = undef;
- if ($options_parent_names[$index]
- && (($wee_version_number < 0x00040300) || (weechat::infolist_search_var($infolist, "parent_value"))))
- {
- $options_parent_values[$index] = weechat::infolist_string($infolist, "parent_value");
- }
- iset_refresh_line($index);
- iset_title() if ($option_name eq "iset.look.show_current_line");
- }
- else
- {
- iset_full_refresh(1); # if not found, refresh fully without clearing buffer
- weechat::print_y($iset_buffer, $#options_names + 1, "");
- }
- weechat::infolist_free($infolist);
- }
-}
-
-sub iset_config_cb
-{
- my ($data, $option_name, $value) = ($_[0], $_[1], $_[2]);
-
- if ($iset_buffer ne "")
- {
- return weechat::WEECHAT_RC_OK if (weechat::info_get("weechat_upgrading", "") eq "1");
-
- my $index = iset_get_option_name_index($option_name);
- if ($index >= 0)
- {
- # refresh info about changed option
- iset_refresh_option($option_name, $index);
- # refresh any other option having this changed option as parent
- foreach my $i (0 .. $#options_names)
- {
- if ($options_parent_names[$i] eq $option_name)
- {
- iset_refresh_option($options_names[$i], $i);
- }
- }
- }
- else
- {
- iset_full_refresh() if ($option_name ne "weechat.bar.isetbar.hidden");
- }
- }
-
- return weechat::WEECHAT_RC_OK;
-}
-
-sub iset_set_option
-{
- my ($option, $value) = ($_[0],$_[1]);
- if (defined $option and defined $value)
- {
- $option = weechat::config_get($option);
- weechat::config_option_set($option, $value, 1) if ($option ne "");
- }
-}
-
-sub iset_reset_option
-{
- my $option = $_[0];
- if (defined $option)
- {
- $option = weechat::config_get($option);
- weechat::config_option_reset($option, 1) if ($option ne "");
- }
-}
-
-sub iset_unset_option
-{
- my $option = $_[0];
- if (defined $option)
- {
- $option = weechat::config_get($option);
- weechat::config_option_unset($option) if ($option ne "");
- }
-}
-
-
-sub iset_cmd_cb
-{
- my ($data, $buffer, $args) = ($_[0], $_[1], $_[2]);
- my $filter_set = 0;
-# $search_value = "";
- if (($args ne "") && (substr($args, 0, 2) ne "**"))
- {
- my @cmd_array = split(/ /,$args);
- my $array_count = @cmd_array;
- if (substr($args, 0, 1) eq weechat::config_string($options_iset{"value_search_char"})
- or (defined $cmd_array[0] and $cmd_array[0] eq weechat::config_string($options_iset{"value_search_char"}).weechat::config_string($options_iset{"value_search_char"})) )
- {
- $search_mode = 1;
- my $search_value = substr($args, 1); # cut value_search_char
- if ($iset_buffer ne "")
- {
- weechat::buffer_clear($iset_buffer);
- weechat::command($iset_buffer, "/window refresh");
- }
- weechat::buffer_set($iset_buffer, "localvar_set_iset_search_mode", $search_mode);
- weechat::buffer_set($iset_buffer, "localvar_set_iset_search_value", $search_value);
- iset_init();
- iset_get_values($search_value);
- iset_refresh();
- weechat::buffer_set($iset_buffer, "display", "1");
-# $filter = $var_value;
- return weechat::WEECHAT_RC_OK;
- }
- else
- {
- # f/s option =value
- # option =value
- $search_mode = 2; # grep on option
- if ( $array_count >= 2 and $cmd_array[0] ne "f" or $cmd_array[0] ne "s")
- {
- if ( defined $cmd_array[1] and substr($cmd_array[1], 0, 1) eq weechat::config_string($options_iset{"value_search_char"})
- or defined $cmd_array[2] and substr($cmd_array[2], 0, 1) eq weechat::config_string($options_iset{"value_search_char"}) )
- {
- $search_mode = 3; # grep on option and value
- $search_value = substr($cmd_array[1], 1); # cut value_search_char
- $search_value = substr($cmd_array[2], 1) if ( $array_count > 2); # cut value_search_char
- }
- }
-
- # show all diff values
- if ( $args eq "d")
- {
- $search_mode = 4;
- $search_value = "*";
- $args = $search_value;
- }
- if ( $array_count >= 2 and $cmd_array[0] eq "d")
- {
- $search_mode = 5;
- $search_value = substr($cmd_array[1], 0); # cut value_search_char
- $search_value = substr($cmd_array[2], 0) if ( $array_count > 2); # cut value_search_char
- $args = $search_value;
- }
-
- iset_create_filter($args);
- $filter_set = 1;
- my $ptrbuf = weechat::buffer_search($LANG, $PRGNAME);
-
- if ($ptrbuf eq "")
- {
- iset_init();
- iset_get_options($search_value);
- iset_full_refresh();
- weechat::buffer_set(weechat::buffer_search($LANG, $PRGNAME), "display", "1");
- weechat::buffer_set($iset_buffer, "localvar_set_iset_search_value", $search_value);
- weechat::buffer_set($iset_buffer, "localvar_set_iset_search_mode", $search_mode);
- return weechat::WEECHAT_RC_OK;
- }
- else
- {
- iset_get_options($search_value);
- iset_full_refresh();
- weechat::buffer_set($ptrbuf, "display", "1");
- }
- }
- weechat::buffer_set($iset_buffer, "localvar_set_iset_search_mode", $search_mode);
- weechat::buffer_set($iset_buffer, "localvar_set_iset_search_value", $search_value);
- }
- if ($iset_buffer eq "")
- {
- iset_init();
- iset_get_options("");
- iset_refresh();
- }
- else
- {
-# iset_get_options($search_value);
- iset_full_refresh() if ($filter_set);
- }
-
- if ($args eq "")
- {
- weechat::buffer_set($iset_buffer, "display", "1");
- }
- else
- {
- if ($args eq "**refresh")
- {
- iset_full_refresh();
- }
- if ($args eq "**up")
- {
- if ($current_line > 0)
- {
- $current_line--;
- iset_refresh_line($current_line + 1);
- iset_refresh_line($current_line);
- iset_check_line_outside_window();
- }
- }
- if ($args eq "**down")
- {
- if ($current_line < $#options_names)
- {
- $current_line++;
- iset_refresh_line($current_line - 1);
- iset_refresh_line($current_line);
- iset_check_line_outside_window();
- }
- }
- if ($args eq "**left" && $wee_version_number >= 0x00030600)
- {
- weechat::command($iset_buffer, "/window scroll_horiz ".iset_get_window_number()."-".weechat::config_integer($options_iset{"scroll_horiz"})."%");
- }
- if ($args eq "**right" && $wee_version_number >= 0x00030600)
- {
- weechat::command($iset_buffer, "/window scroll_horiz ".iset_get_window_number().weechat::config_integer($options_iset{"scroll_horiz"})."%");
- }
- if ($args eq "**scroll_top")
- {
- my $old_current_line = $current_line;
- $current_line = 0;
- iset_refresh_line ($old_current_line);
- iset_refresh_line ($current_line);
- iset_title();
- weechat::command($iset_buffer, "/window scroll_top ".iset_get_window_number());
- }
- if ($args eq "**scroll_bottom")
- {
- my $old_current_line = $current_line;
- $current_line = $#options_names;
- iset_refresh_line ($old_current_line);
- iset_refresh_line ($current_line);
- iset_title();
- weechat::command($iset_buffer, "/window scroll_bottom ".iset_get_window_number());
- }
- if ($args eq "**toggle")
- {
- if ($options_types[$current_line] eq "boolean")
- {
- iset_set_option($options_names[$current_line], "toggle");
- }
- }
- if ($args eq "**incr")
- {
- if (($options_types[$current_line] eq "integer")
- || ($options_types[$current_line] eq "color"))
- {
- iset_set_option($options_names[$current_line], "++1");
- }
- }
- if ($args eq "**decr")
- {
- if (($options_types[$current_line] eq "integer")
- || ($options_types[$current_line] eq "color"))
- {
- iset_set_option($options_names[$current_line], "--1");
- }
- }
- if ($args eq "**reset")
- {
- iset_reset_option($options_names[$current_line]);
- }
- if ($args eq "**unset")
- {
- iset_unset_option($options_names[$current_line]);
- }
- if ($args eq "**toggle_help")
- {
- if (weechat::config_boolean($options_iset{"show_help_bar"}) == 1)
- {
- weechat::config_option_set($options_iset{"show_help_bar"},0,1);
- iset_show_bar(0);
- }
- else
- {
- weechat::config_option_set($options_iset{"show_help_bar"},1,1);
- iset_show_bar(1);
- }
- }
- if ($args eq "**toggle_show_plugin_desc")
- {
- if (weechat::config_boolean($options_iset{"show_plugin_description"}) == 1)
- {
- weechat::config_option_set($options_iset{"show_plugin_description"},0,1);
- iset_full_refresh();
- iset_check_line_outside_window();
- iset_title();
- }
- else
- {
- weechat::config_option_set($options_iset{"show_plugin_description"},1,1);
- iset_full_refresh();
- iset_check_line_outside_window();
- iset_title();
- }
- }
- if ($args eq "**set")
- {
- my $quote = "";
- my $value = $options_values[$current_line];
- if ($options_is_null[$current_line])
- {
- $value = "";
- }
- else
- {
- $quote = "\"" if ($options_types[$current_line] eq "string");
- }
- $value = " ".$quote.$value.$quote if ($value ne "" or $quote ne "");
-
- my $set_command = "/set";
- my $start_index = 5;
- if (weechat::config_boolean($options_iset{"use_mute"}) == 1)
- {
- $set_command = "/mute ".$set_command;
- $start_index += 11;
- }
- $set_command = $set_command." ".$options_names[$current_line].$value;
- my $pos_space = index($set_command, " ", $start_index);
- if ($pos_space < 0)
- {
- $pos_space = 9999;
- }
- else
- {
- $pos_space = $pos_space + 1;
- $pos_space = $pos_space + 1 if ($quote ne "");
- }
- weechat::buffer_set($iset_buffer, "input", $set_command);
- weechat::buffer_set($iset_buffer, "input_pos", "".$pos_space);
- }
- }
- weechat::bar_item_update("isetbar_help") if (weechat::config_boolean($options_iset{"show_help_bar"}) == 1);
- return weechat::WEECHAT_RC_OK;
-}
-
-sub iset_get_help
-{
- my ($redraw) = ($_[0]);
-
- return '' if (weechat::config_boolean($options_iset{"show_help_bar"}) == 0);
-
- if (not defined $options_names[$current_line])
- {
- return "No option selected. Set a new filter using command line (use '*' to see all options)";
- }
- if ($options_name_copy eq $options_names[$current_line] and not defined $redraw)
- {
- return $description;
- }
- $options_name_copy = $options_names[$current_line];
- my $optionlist ="";
- $optionlist = weechat::infolist_get("option", "", $options_names[$current_line]);
- weechat::infolist_next($optionlist);
- my $full_name = weechat::infolist_string($optionlist,"full_name");
- my $option_desc = "";
- my $option_default_value = "";
- my $option_range = "";
- my $possible_values = "";
- my $re = qq(\Q$full_name);
- if (grep (/^$re$/,$options_names[$current_line]))
- {
- $option_desc = weechat::infolist_string($optionlist, "description_nls");
- $option_desc = weechat::infolist_string($optionlist, "description") if ($option_desc eq "");
- $option_desc = "No help found" if ($option_desc eq "");
- $option_default_value = weechat::infolist_string($optionlist, "default_value");
- $possible_values = weechat::infolist_string($optionlist, "string_values") if (weechat::infolist_string($optionlist, "string_values") ne "");
- if ((weechat::infolist_string($optionlist, "type") eq "integer") && ($possible_values eq ""))
- {
- $option_range = weechat::infolist_integer($optionlist, "min")
- ." .. ".weechat::infolist_integer($optionlist, "max");
- }
- }
- weechat::infolist_free($optionlist);
- iset_title();
-
- $description = weechat::color(weechat::config_color($options_iset{"color_help_option_name"})).$options_names[$current_line]
- .weechat::color("bar_fg").": "
- .weechat::color(weechat::config_color($options_iset{"color_help_text"})).$option_desc;
-
- # show additional infos like default value and possible values
-
- if (weechat::config_boolean($options_iset{"show_help_extra_info"}) == 1)
- {
- $description .=
- weechat::color("bar_delim")." ["
- .weechat::color("bar_fg")."default: "
- .weechat::color("bar_delim")."\""
- .weechat::color(weechat::config_color($options_iset{"color_help_default_value"})).$option_default_value
- .weechat::color("bar_delim")."\"";
- if ($option_range ne "")
- {
- $description .= weechat::color("bar_fg").", values: ".$option_range;
- }
- if ($possible_values ne "")
- {
- $possible_values =~ s/\|/", "/g; # replace '|' to '", "'
- $description .= weechat::color("bar_fg").", values: ". "\"" . $possible_values . "\"";
-
- }
- $description .= weechat::color("bar_delim")."]";
- }
- return $description;
-}
-
-sub iset_check_condition_isetbar_cb
-{
- my ($data, $modifier, $modifier_data, $string) = ($_[0], $_[1], $_[2], $_[3]);
- my $buffer = weechat::window_get_pointer($modifier_data, "buffer");
- if ($buffer ne "")
- {
- if ((weechat::buffer_get_string($buffer, "plugin") eq $LANG)
- && (weechat::buffer_get_string($buffer, "name") eq $PRGNAME))
- {
- return "1";
- }
- }
- return "0";
-}
-
-sub iset_show_bar
-{
- my $show = $_[0];
- my $barhidden = weechat::config_get("weechat.bar.isetbar.hidden");
- if ($barhidden)
- {
- if ($show)
- {
- if (weechat::config_boolean($options_iset{"show_help_bar"}) == 1)
- {
- if (weechat::config_boolean($barhidden))
- {
- weechat::config_option_set($barhidden, 0, 1);
- }
- }
- }
- else
- {
- if (!weechat::config_boolean($barhidden))
- {
- weechat::config_option_set($barhidden, 1, 1);
- }
- }
- }
-}
-
-sub iset_signal_buffer_switch_cb
-{
- my $buffer_pointer = $_[2];
- my $show_bar = 0;
- $show_bar = 1 if (weechat::buffer_get_integer($iset_buffer, "num_displayed") > 0);
- iset_show_bar($show_bar);
- iset_check_line_outside_window() if ($buffer_pointer eq $iset_buffer);
- return weechat::WEECHAT_RC_OK;
-}
-
-sub iset_item_cb
-{
- return iset_get_help();
-}
-
-sub iset_upgrade_ended
-{
- iset_full_refresh();
-}
-
-sub iset_end
-{
- # when script is unloaded, we hide bar
- iset_show_bar(0);
-}
-
-# -------------------------------[ mouse support ]-------------------------------------
-
-sub hook_focus_iset_cb
-{
- my %info = %{$_[1]};
- my $bar_item_line = int($info{"_bar_item_line"});
- undef my $hash;
- if (($info{"_buffer_name"} eq $PRGNAME) && $info{"_buffer_plugin"} eq $LANG && ($bar_item_line >= 0) && ($bar_item_line <= $#iset_focus))
- {
- $hash = $iset_focus[$bar_item_line];
- }
- else
- {
- $hash = {};
- my $hash_focus = $iset_focus[0];
- foreach my $key (keys %$hash_focus)
- {
- $hash->{$key} = "?";
- }
- }
- return $hash;
-}
-
-# _chat_line_y contains selected line
-sub iset_hsignal_mouse_cb
-{
- my ($data, $signal, %hash) = ($_[0], $_[1], %{$_[2]});
-
- return weechat::WEECHAT_RC_OK unless (@options_types);
-
- if ($hash{"_buffer_name"} eq $PRGNAME && ($hash{"_buffer_plugin"} eq $LANG))
- {
- if ($hash{"_key"} eq "button1")
- {
- iset_set_current_line($hash{"_chat_line_y"});
- }
- elsif ($hash{"_key"} eq "button2")
- {
- if ($options_types[$hash{"_chat_line_y"}] eq "boolean")
- {
- iset_set_option($options_names[$hash{"_chat_line_y"}], "toggle");
- iset_set_current_line($hash{"_chat_line_y"});
- }
- elsif ($options_types[$hash{"_chat_line_y"}] eq "string")
- {
- iset_set_current_line($hash{"_chat_line_y"});
- weechat::command("", "/$PRGNAME **set");
- }
- }
- elsif ($hash{"_key"} eq "button2-gesture-left" or $hash{"_key"} eq "button2-gesture-left-long")
- {
- if ($options_types[$hash{"_chat_line_y"}] eq "integer" or ($options_types[$hash{"_chat_line_y"}] eq "color"))
- {
- iset_set_current_line($hash{"_chat_line_y"});
- my $distance = distance($hash{"_chat_line_x"},$hash{"_chat_line_x2"});
- weechat::command("", "/repeat $distance /$PRGNAME **decr");
- }
- }
- elsif ($hash{"_key"} eq "button2-gesture-right" or $hash{"_key"} eq "button2-gesture-right-long")
- {
- if ($options_types[$hash{"_chat_line_y"}] eq "integer" or ($options_types[$hash{"_chat_line_y"}] eq "color"))
- {
- iset_set_current_line($hash{"_chat_line_y"});
- my $distance = distance($hash{"_chat_line_x"},$hash{"_chat_line_x2"});
- weechat::command("", "/repeat $distance /$PRGNAME **incr");
- }
- }
- }
- window_switch();
-}
-
-sub window_switch
-{
- my $current_window = weechat::current_window();
- my $dest_window = weechat::window_search_with_buffer(weechat::buffer_search("perl","iset"));
- return 0 if ($dest_window eq "" or $current_window eq $dest_window);
-
- my $infolist = weechat::infolist_get("window", $dest_window, "");
- weechat::infolist_next($infolist);
- my $number = weechat::infolist_integer($infolist, "number");
- weechat::infolist_free($infolist);
- weechat::command("","/window " . $number);
-}
-
-sub distance
-{
- my ($x1,$x2) = ($_[0], $_[1]);
- my $distance;
- $distance = $x1 - $x2;
- $distance = abs($distance);
- if ($distance > 0)
- {
- use integer;
- $distance = $distance / 3;
- $distance = 1 if ($distance == 0);
- }
- elsif ($distance == 0)
- {
- $distance = 1;
- }
- return $distance;
-}
-
-# -----------------------------------[ config ]---------------------------------------
-
-sub iset_config_init
-{
- $iset_config_file = weechat::config_new($ISET_CONFIG_FILE_NAME,"iset_config_reload_cb","");
- return if ($iset_config_file eq "");
-
- # section "color"
- my $section_color = weechat::config_new_section($iset_config_file,"color", 0, 0, "", "", "", "", "", "", "", "", "", "");
- if ($section_color eq "")
- {
- weechat::config_free($iset_config_file);
- return;
- }
- $options_iset{"color_option"} = weechat::config_new_option(
- $iset_config_file, $section_color,
- "option", "color", "Color for option name in iset buffer", "", 0, 0,
- "default", "default", 0, "", "", "full_refresh_cb", "", "", "");
- $options_iset{"color_option_selected"} = weechat::config_new_option(
- $iset_config_file, $section_color,
- "option_selected", "color", "Color for selected option name in iset buffer", "", 0, 0,
- "white", "white", 0, "", "", "full_refresh_cb", "", "", "");
- $options_iset{"color_type"} = weechat::config_new_option(
- $iset_config_file, $section_color,
- "type", "color", "Color for option type (integer, boolean, string)", "", 0, 0,
- "brown", "brown", 0, "", "", "full_refresh_cb", "", "", "");
- $options_iset{"color_type_selected"} = weechat::config_new_option(
- $iset_config_file, $section_color,
- "type_selected", "color", "Color for selected option type (integer, boolean, string)", "", 0, 0,
- "yellow", "yellow", 0, "", "", "full_refresh_cb", "", "", "");
- $options_iset{"color_value"} = weechat::config_new_option(
- $iset_config_file, $section_color,
- "value", "color", "Color for option value", "", 0, 0,
- "cyan", "cyan", 0, "", "", "full_refresh_cb", "", "", "");
- $options_iset{"color_value_selected"} = weechat::config_new_option(
- $iset_config_file, $section_color,
- "value_selected", "color", "Color for selected option value", "", 0, 0,
- "lightcyan", "lightcyan", 0, "", "", "full_refresh_cb", "", "", "");
- $options_iset{"color_value_diff"} = weechat::config_new_option(
- $iset_config_file, $section_color,
- "value_diff", "color", "Color for option value different from default", "", 0, 0,
- "magenta", "magenta", 0, "", "", "full_refresh_cb", "", "", "");
- $options_iset{"color_value_diff_selected"} = weechat::config_new_option(
- $iset_config_file, $section_color,
- "value_diff_selected", "color", "Color for selected option value different from default", "", 0, 0,
- "lightmagenta", "lightmagenta", 0, "", "", "full_refresh_cb", "", "", "");
- $options_iset{"color_value_undef"} = weechat::config_new_option(
- $iset_config_file, $section_color,
- "value_undef", "color", "Color for option value undef", "", 0, 0,
- "green", "green", 0, "", "", "full_refresh_cb", "", "", "");
- $options_iset{"color_value_undef_selected"} = weechat::config_new_option(
- $iset_config_file, $section_color,
- "value_undef_selected", "color", "Color for selected option value undef", "", 0, 0,
- "lightgreen", "lightgreen", 0, "", "", "full_refresh_cb", "", "", "");
- $options_iset{"color_bg_selected"} = weechat::config_new_option(
- $iset_config_file, $section_color,
- "bg_selected", "color", "Background color for current selected option", "", 0, 0,
- "red", "red", 0, "", "", "full_refresh_cb", "", "", "");
- $options_iset{"color_help_option_name"} = weechat::config_new_option(
- $iset_config_file, $section_color,
- "help_option_name", "color", "Color for option name in help-bar", "", 0, 0,
- "white", "white", 0, "", "", "bar_refresh", "", "", "");
- $options_iset{"color_help_text"} = weechat::config_new_option(
- $iset_config_file, $section_color,
- "help_text", "color", "Color for option description in help-bar", "", 0, 0,
- "default", "default", 0, "", "", "bar_refresh", "", "", "");
- $options_iset{"color_help_default_value"} = weechat::config_new_option(
- $iset_config_file, $section_color,
- "help_default_value", "color", "Color for default option value in help-bar", "", 0, 0,
- "green", "green", 0, "", "", "bar_refresh", "", "", "");
-
- # section "help"
- my $section_help = weechat::config_new_section($iset_config_file,"help", 0, 0, "", "", "", "", "", "", "", "", "", "");
- if ($section_help eq "")
- {
- weechat::config_free($iset_config_file);
- return;
- }
- $options_iset{"show_help_bar"} = weechat::config_new_option(
- $iset_config_file, $section_help,
- "show_help_bar", "boolean", "Show help bar", "", 0, 0,
- "on", "on", 0, "", "", "toggle_help_cb", "", "", "");
- $options_iset{"show_help_extra_info"} = weechat::config_new_option(
- $iset_config_file, $section_help,
- "show_help_extra_info", "boolean", "Show additional information in help bar (default value, max./min. value) ", "", 0, 0,
- "on", "on", 0, "", "", "", "", "", "");
- $options_iset{"show_plugin_description"} = weechat::config_new_option(
- $iset_config_file, $section_help,
- "show_plugin_description", "boolean", "Show plugin description in iset buffer", "", 0, 0,
- "off", "off", 0, "", "", "full_refresh_cb", "", "", "");
-
- # section "look"
- my $section_look = weechat::config_new_section($iset_config_file, "look", 0, 0, "", "", "", "", "", "", "", "", "", "");
- if ($section_look eq "")
- {
- weechat::config_free($iset_config_file);
- return;
- }
- $options_iset{"value_search_char"} = weechat::config_new_option(
- $iset_config_file, $section_look,
- "value_search_char", "string", "Trigger char to tell iset to search for value instead of option (for example: =red)", "", 0, 0,
- "=", "=", 0, "", "", "", "", "", "");
- $options_iset{"scroll_horiz"} = weechat::config_new_option(
- $iset_config_file, $section_look,
- "scroll_horiz", "integer", "scroll content of iset buffer n%", "", 1, 100,
- "10", "10", 0, "", "", "", "", "", "");
- $options_iset{"show_current_line"} = weechat::config_new_option(
- $iset_config_file, $section_look,
- "show_current_line", "boolean", "show current line in title bar.", "", 0, 0,
- "on", "on", 0, "", "", "", "", "", "");
- $options_iset{"use_mute"} = weechat::config_new_option(
- $iset_config_file, $section_look,
- "use_mute", "boolean", "/mute command will be used in input bar", "", 0, 0,
- "off", "off", 0, "", "", "", "", "", "");
-}
-
-sub iset_config_reload_cb
-{
- my ($data,$config_file) = ($_[0], $_[1]);
- return weechat::config_reload($config_file)
-}
-
-sub iset_config_read
-{
- return weechat::config_read($iset_config_file) if ($iset_config_file ne "");
-}
-
-sub iset_config_write
-{
- return weechat::config_write($iset_config_file) if ($iset_config_file ne "");
-}
-
-sub full_refresh_cb
-{
- iset_full_refresh();
- return weechat::WEECHAT_RC_OK;
-}
-
-sub bar_refresh
-{
- iset_get_help(1);
- weechat::bar_item_update("isetbar_help") if (weechat::config_boolean($options_iset{"show_help_bar"}) == 1);
- return weechat::WEECHAT_RC_OK;
-}
-
-sub toggle_help_cb
-{
- my $value = weechat::config_boolean($options_iset{"show_help_bar"});
- iset_show_bar($value);
- return weechat::WEECHAT_RC_OK;
-}
-
-# -----------------------------------[ main ]-----------------------------------------
-
-weechat::register($PRGNAME, $AUTHOR, $VERSION, $LICENSE,
- $DESCR, "iset_end", "");
-
-$wee_version_number = weechat::info_get("version_number", "") || 0;
-
-iset_config_init();
-iset_config_read();
-
-weechat::hook_command($PRGNAME, "Interactive set", "d <text> || f <file> || s <section> || [=][=]<text>",
- "d <text> : show only changed options\n".
- "f file : show options for a file\n".
- "s section: show options for a section\n".
- "text : show options with 'text' in name\n".
- weechat::config_string($options_iset{"value_search_char"})."text : show options with 'text' in value\n".
- weechat::config_string($options_iset{"value_search_char"}).weechat::config_string($options_iset{"value_search_char"})."text : show options with exact 'text' in value\n\n".
- "Keys for iset buffer:\n".
- "f11,f12 : move iset content left/right\n".
- "up,down : move one option up/down\n".
- "pgup,pdwn : move one page up/down\n".
- "home,end : move to first/last option\n".
- "ctrl+'L' : refresh options and screen\n".
- "alt+space : toggle boolean on/off\n".
- "alt+'+' : increase value (for integer or color)\n".
- "alt+'-' : decrease value (for integer or color)\n".
- "alt+'i',alt+'r': reset value of option\n".
- "alt+'i',alt+'u': unset option\n".
- "alt+enter : set new value for option (edit it with command line)\n".
- "text,enter : set a new filter using command line (use '*' to see all options)\n".
- "alt+'v' : toggle help bar on/off\n".
- "alt+'p' : toggle option \"show_plugin_description\" on/off\n".
- "q : as input in iset buffer to close it\n".
- "\n".
- "Mouse actions:\n".
- "wheel up/down : move cursor up/down\n".
- "left button : select an option from list\n".
- "right button : toggle boolean (on/off) or set a new value for option (edit it with command line)\n".
- "right button + drag left/right: increase/decrease value (for integer or color)\n".
- "\n".
- "Examples:\n".
- " show changed options in 'aspell' plugin\n".
- " /iset d aspell\n".
- " show options for file 'irc'\n".
- " /iset f irc\n".
- " show options for section 'look'\n".
- " /iset s look\n".
- " show all options with text 'nicklist' in name\n".
- " /iset nicklist\n".
- " show all values which contain 'red'. ('" . weechat::config_string($options_iset{"value_search_char"}) . "' is a trigger char).\n".
- " /iset ". weechat::config_string($options_iset{"value_search_char"}) ."red\n".
- " show all values which hit 'off'. ('" . weechat::config_string($options_iset{"value_search_char"}) . weechat::config_string($options_iset{"value_search_char"}) . "' is a trigger char).\n".
- " /iset ". weechat::config_string($options_iset{"value_search_char"}) . weechat::config_string($options_iset{"value_search_char"}) ."off\n".
- " show options for file 'weechat' which contains value 'off'\n".
- " /iset f weechat ".weechat::config_string($options_iset{"value_search_char"})."off\n".
- "",
- "", "iset_cmd_cb", "");
-weechat::hook_signal("upgrade_ended", "iset_upgrade_ended", "");
-weechat::hook_signal("window_scrolled", "iset_signal_window_scrolled_cb", "");
-weechat::hook_signal("buffer_switch", "iset_signal_buffer_switch_cb","");
-weechat::bar_item_new("isetbar_help", "iset_item_cb", "");
-weechat::bar_new("isetbar", "on", "0", "window", "", "top", "horizontal",
- "vertical", "3", "3", "default", "cyan", "default", "1",
- "isetbar_help");
-weechat::hook_modifier("bar_condition_isetbar", "iset_check_condition_isetbar_cb", "");
-weechat::hook_config("*", "iset_config_cb", "");
-$iset_buffer = weechat::buffer_search($LANG, $PRGNAME);
-iset_init() if ($iset_buffer ne "");
-
-if ($wee_version_number >= 0x00030600)
-{
- weechat::hook_focus("chat", "hook_focus_iset_cb", "");
- weechat::hook_hsignal($PRGNAME."_mouse", "iset_hsignal_mouse_cb", "");
- weechat::key_bind("mouse", \%mouse_keys);
-}
diff --git a/.weechat/perl/perlexec.pl b/.weechat/perl/perlexec.pl
deleted file mode 100644
index 0490a761..00000000
--- a/.weechat/perl/perlexec.pl
+++ /dev/null
@@ -1,38 +0,0 @@
-# perlexec.pl by ArZa <arza@arza.us>: Execute perl code
-
-# This program is free software: you can modify/redistribute it under the terms of
-# GNU General Public License by Free Software Foundation, either version 3 or later
-# which you can get from <http://www.gnu.org/licenses/>.
-# This program is distributed in the hope that it will be useful, but without any warranty.
-
-weechat::register("perlexec", "ArZa <arza\@arza.us>", "0.1", "GPL3", "Execute perl code", "", "");
-weechat::hook_command("perlexec", "Execute perl code", "[code]",
- "Executes perl code given as an argument or creates a buffer for execution if not given an argument.\n\n".
- "Code is anything like in a weechat perl script, executed in one block.\n\n".
- "\$buffer is predefined as a pointer for the buffer where this command is executed.\n\n".
- "For example, close current buffer if it's a query:\n".
- " /perlexec weechat::buffer_close(\$buffer) if weechat::buffer_get_string(\$buffer, \"localvar_type\") eq \"private\";",
- "", "perlexec", "");
-
-sub perlexec { # the command
- if($_[2]){ # if got an argument
- my $buffer=$_[1];
- eval($_[2]); # execute
- }else{
- my $buffer=weechat::buffer_search("perl", "perlexec"); # find the buffer
- if(!$buffer){ # if not found
- $buffer=weechat::buffer_new("perlexec", "buffer_input", "", "", ""); # create it
- weechat::buffer_set($buffer, "title", "Perl execution buffer"); # set title
- }
- if(weechat::current_buffer() eq $buffer){ weechat::buffer_close($buffer); } # if we already are in the buffer, close it
- else{ weechat::buffer_set($buffer, "display", 1); } # otherwise, switch to it
- }
- return weechat::WEECHAT_RC_OK;
-}
-
-sub buffer_input { # input in the buffer
- my $buffer=$_[1];
- weechat::print($buffer, "> ".$_[2]); # print
- eval($_[2]); # execute
- return weechat::WEECHAT_RC_OK;
-}
diff --git a/.weechat/plugins.conf b/.weechat/plugins.conf
deleted file mode 100644
index cdc1fa4b..00000000
--- a/.weechat/plugins.conf
+++ /dev/null
@@ -1,126 +0,0 @@
-#
-# weechat -- plugins.conf
-#
-# WARNING: It is NOT recommended to edit this file by hand,
-# especially if WeeChat is running.
-#
-# Use /set or similar command to change settings in WeeChat.
-#
-# For more info, see: https://weechat.org/doc/quickstart
-#
-
-[var]
-fifo.fifo = "on"
-perl.check_license = "off"
-perl.highmon.alignment = "channel"
-perl.highmon.away_only = "off"
-perl.highmon.color_buf = "on"
-perl.highmon.first_run = "true"
-perl.highmon.hotlist_show = "off"
-perl.highmon.logging = "off"
-perl.highmon.merge_private = "off"
-perl.highmon.nick_prefix = "<"
-perl.highmon.nick_suffix = ">"
-perl.highmon.output = "buffer"
-perl.highmon.short_names = "off"
-python.check_license = "off"
-python.go.auto_jump = "off"
-python.go.buffer_number = "on"
-python.go.color_name = "black,cyan"
-python.go.color_name_highlight = "red,cyan"
-python.go.color_name_highlight_selected = "red,brown"
-python.go.color_name_selected = "black,brown"
-python.go.color_number = "yellow,magenta"
-python.go.color_number_selected = "yellow,red"
-python.go.fuzzy_search = "off"
-python.go.message = "Go to: "
-python.go.short_name = "off"
-python.go.sort = "number,beginning"
-python.go.use_core_instead_weechat = "off"
-python.urlserver.buffer_short_name = "off"
-python.urlserver.color = "darkgray"
-python.urlserver.color_in_msg = ""
-python.urlserver.debug = "off"
-python.urlserver.display_urls = "on"
-python.urlserver.display_urls_in_msg = "off"
-python.urlserver.http_allowed_ips = ""
-python.urlserver.http_auth = ""
-python.urlserver.http_auth_redirect = "on"
-python.urlserver.http_autostart = "on"
-python.urlserver.http_bg_color = "#f4f4f4"
-python.urlserver.http_css_url = ""
-python.urlserver.http_embed_image = "off"
-python.urlserver.http_embed_youtube = "off"
-python.urlserver.http_embed_youtube_size = "480*350"
-python.urlserver.http_fg_color = "#000"
-python.urlserver.http_hostname = "localhost"
-python.urlserver.http_hostname_display = ""
-python.urlserver.http_open_in_new_page = "on"
-python.urlserver.http_port = "60211"
-python.urlserver.http_port_display = ""
-python.urlserver.http_prefix_suffix = " "
-python.urlserver.http_scheme_display = "http"
-python.urlserver.http_time_format = "%d/%m/%y %H:%M:%S"
-python.urlserver.http_title = "WeeChat URLs"
-python.urlserver.http_url_prefix = ""
-python.urlserver.msg_filtered = "off"
-python.urlserver.msg_ignore_buffers = "core.weechat,python.grep"
-python.urlserver.msg_ignore_dup_urls = "off"
-python.urlserver.msg_ignore_regex = ""
-python.urlserver.msg_ignore_tags = "irc_quit,irc_part,notify_none"
-python.urlserver.msg_require_tags = "nick_"
-python.urlserver.separators = "[|]"
-python.urlserver.url_min_length = "0"
-python.urlserver.urls_amount = "100"
-ruby.check_license = "off"
-tcl.check_license = "off"
-
-[desc]
-python.go.auto_jump = "automatically jump to buffer when it is uniquely selected (default: "off")"
-python.go.buffer_number = "display buffer number (default: "on")"
-python.go.color_name = "color for buffer name (not selected) (default: "black,cyan")"
-python.go.color_name_highlight = "color for highlight in buffer name (not selected) (default: "red,cyan")"
-python.go.color_name_highlight_selected = "color for highlight in a selected buffer name (default: "red,brown")"
-python.go.color_name_selected = "color for a selected buffer name (default: "black,brown")"
-python.go.color_number = "color for buffer number (not selected) (default: "yellow,magenta")"
-python.go.color_number_selected = "color for selected buffer number (default: "yellow,red")"
-python.go.fuzzy_search = "search buffer matches using approximation (default: "off")"
-python.go.message = "message to display before list of buffers (default: "Go to: ")"
-python.go.short_name = "display and search in short names instead of buffer name (default: "off")"
-python.go.sort = "comma-separated list of keys to sort buffers (the order is important, sorts are performed in the given order): name = sort by name (or short name), (default: "number,beginning")"
-python.go.use_core_instead_weechat = "use name "core" instead of "weechat" for core buffer (default: "off")"
-python.urlserver.buffer_short_name = "use buffer short name on dedicated buffer (default: "off")"
-python.urlserver.color = "color for urls displayed after message (default: "darkgray")"
-python.urlserver.color_in_msg = "color for urls displayed inside irc message: it is a number (irc color) between 00 and 15 (see doc for a list of irc colors) (default: "")"
-python.urlserver.debug = "print some debug messages (default: "off")"
-python.urlserver.display_urls = "display URLs below messages (default: "on")"
-python.urlserver.display_urls_in_msg = "add shorten url next to the original url (only in IRC messages) (useful for urlserver behind relay/irc) (default: "off")"
-python.urlserver.http_allowed_ips = "regex for IPs allowed to use server (example: "^(123.45.67.89|192.160.*)$") (default: "")"
-python.urlserver.http_auth = "login and password (format: "login:password") required to access to page with list of URLs (note: content is evaluated, see /help eval) (default: "")"
-python.urlserver.http_auth_redirect = "require the login/password (if option "http_auth" is set) for URLs redirections (default: "on")"
-python.urlserver.http_autostart = "start the built-in HTTP server automatically) (default: "on")"
-python.urlserver.http_bg_color = "background color for HTML page (default: "#f4f4f4")"
-python.urlserver.http_css_url = "URL of external Cascading Style Sheet to add (BE CAREFUL: the HTTP referer will be sent to site hosting CSS file!) (empty value = use default embedded CSS) (default: "")"
-python.urlserver.http_embed_image = "embed images in HTML page (BE CAREFUL: the HTTP referer will be sent to site hosting image!) (default: "off")"
-python.urlserver.http_embed_youtube = "embed youtube videos in HTML page (BE CAREFUL: the HTTP referer will be sent to youtube!) (default: "off")"
-python.urlserver.http_embed_youtube_size = "size for embedded youtube video, format is "xxx*yyy" (default: "480*350")"
-python.urlserver.http_fg_color = "foreground color for HTML page (default: "#000")"
-python.urlserver.http_hostname = "force hostname/IP in bind of socket (empty value = auto-detect current hostname) (default: "")"
-python.urlserver.http_hostname_display = "display this hostname in shortened URLs (default: "")"
-python.urlserver.http_open_in_new_page = "open links in new pages/tabs (default: "on")"
-python.urlserver.http_port = "force port for listening (empty value = find a random free port) (default: "")"
-python.urlserver.http_port_display = "display this port in shortened URLs. Useful if you forward a different external port to the internal port (default: "")"
-python.urlserver.http_prefix_suffix = "suffix displayed between prefix and message in HTML page (default: " ")"
-python.urlserver.http_scheme_display = "display this scheme in shortened URLs (default: "http")"
-python.urlserver.http_time_format = "time format in the HTML page (default: "%d/%m/%y %H:%M:%S")"
-python.urlserver.http_title = "title of the HTML page (default: "WeeChat URLs")"
-python.urlserver.http_url_prefix = "prefix to add in URLs to prevent external people to scan your URLs (for example: prefix "xx" will give URL: http://host.com:1234/xx/8) (default: "")"
-python.urlserver.msg_filtered = "shorten URLs in filtered messages (with /filter) (default: "off")"
-python.urlserver.msg_ignore_buffers = "comma-separated list (without spaces) of buffers to ignore (full name like "irc.freenode.#weechat") (default: "core.weechat,python.grep")"
-python.urlserver.msg_ignore_dup_urls = "ignore duplicated URLs (do not add an URL in list if it is already) (default: "off")"
-python.urlserver.msg_ignore_regex = "ignore messages matching this regex (default: "")"
-python.urlserver.msg_ignore_tags = "comma-separated list (without spaces) of tags (or beginning of tags) to ignore (for example, use "notify_none" to ignore self messages or "nick_weebot" to ignore messages from nick "weebot") (default: "irc_quit,irc_part,notify_none")"
-python.urlserver.msg_require_tags = "comma-separated list (without spaces) of tags (or beginning of tags) required to shorten URLs (for example "nick_" to shorten URLs only in messages from other users) (default: "nick_")"
-python.urlserver.separators = "separators for short url list (string with exactly 3 chars) (default: "[|]")"
-python.urlserver.url_min_length = "minimum length for an URL to be shortened (0 = shorten all URLs, -1 = detect length based on shorten URL) (default: "0")"
-python.urlserver.urls_amount = "number of URLs to keep in memory (and in file when script is not loaded) (default: "100")"
diff --git a/.weechat/python/autoload/autosort.py b/.weechat/python/autoload/autosort.py
deleted file mode 120000
index 1850897f..00000000
--- a/.weechat/python/autoload/autosort.py
+++ /dev/null
@@ -1 +0,0 @@
-../autosort.py
\ No newline at end of file
diff --git a/.weechat/python/autoload/colorize_nicks.py b/.weechat/python/autoload/colorize_nicks.py
deleted file mode 120000
index 3ee34e96..00000000
--- a/.weechat/python/autoload/colorize_nicks.py
+++ /dev/null
@@ -1 +0,0 @@
-../colorize_nicks.py
\ No newline at end of file
diff --git a/.weechat/python/autoload/go.py b/.weechat/python/autoload/go.py
deleted file mode 100644
index a30f58f0..00000000
--- a/.weechat/python/autoload/go.py
+++ /dev/null
@@ -1,561 +0,0 @@
-# -*- coding: utf-8 -*-
-#
-# Copyright (C) 2009-2014 Sébastien Helleu <flashcode@flashtux.org>
-# Copyright (C) 2010 m4v <lambdae2@gmail.com>
-# Copyright (C) 2011 stfn <stfnmd@googlemail.com>
-#
-# This program is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 3 of the License, or
-# (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program. If not, see <http://www.gnu.org/licenses/>.
-#
-
-#
-# History:
-#
-# 2017-04-01, Sébastien Helleu <flashcode@flashtux.org>:
-# version 2.5: add option "buffer_number"
-# 2017-03-02, Sébastien Helleu <flashcode@flashtux.org>:
-# version 2.4: fix syntax and indentation error
-# 2017-02-25, Simmo Saan <simmo.saan@gmail.com>
-# version 2.3: fix fuzzy search breaking buffer number search display
-# 2016-01-28, ylambda <ylambda@koalabeast.com>
-# version 2.2: add option "fuzzy_search"
-# 2015-11-12, nils_2 <weechatter@arcor.de>
-# version 2.1: fix problem with buffer short_name "weechat", using option
-# "use_core_instead_weechat", see:
-# https://github.com/weechat/weechat/issues/574
-# 2014-05-12, Sébastien Helleu <flashcode@flashtux.org>:
-# version 2.0: add help on options, replace option "sort_by_activity" by
-# "sort" (add sort by name and first match at beginning of
-# name and by number), PEP8 compliance
-# 2012-11-26, Nei <anti.teamidiot.de>
-# version 1.9: add auto_jump option to automatically go to buffer when it
-# is uniquely selected
-# 2012-09-17, Sébastien Helleu <flashcode@flashtux.org>:
-# version 1.8: fix jump to non-active merged buffers (jump with buffer name
-# instead of number)
-# 2012-01-03 nils_2 <weechatter@arcor.de>
-# version 1.7: add option "use_core_instead_weechat"
-# 2012-01-03, Sébastien Helleu <flashcode@flashtux.org>:
-# version 1.6: make script compatible with Python 3.x
-# 2011-08-24, stfn <stfnmd@googlemail.com>:
-# version 1.5: /go with name argument jumps directly to buffer
-# Remember cursor position in buffer input
-# 2011-05-31, Elián Hanisch <lambdae2@gmail.com>:
-# version 1.4: Sort list of buffers by activity.
-# 2011-04-25, Sébastien Helleu <flashcode@flashtux.org>:
-# version 1.3: add info "go_running" (used by script input_lock.rb)
-# 2010-11-01, Sébastien Helleu <flashcode@flashtux.org>:
-# version 1.2: use high priority for hooks to prevent conflict with other
-# plugins/scripts (WeeChat >= 0.3.4 only)
-# 2010-03-25, Elián Hanisch <lambdae2@gmail.com>:
-# version 1.1: use a space to match the end of a string
-# 2009-11-16, Sébastien Helleu <flashcode@flashtux.org>:
-# version 1.0: add new option to display short names
-# 2009-06-15, Sébastien Helleu <flashcode@flashtux.org>:
-# version 0.9: fix typo in /help go with command /key
-# 2009-05-16, Sébastien Helleu <flashcode@flashtux.org>:
-# version 0.8: search buffer by number, fix bug when window is split
-# 2009-05-03, Sébastien Helleu <flashcode@flashtux.org>:
-# version 0.7: eat tab key (do not complete input, just move buffer
-# pointer)
-# 2009-05-02, Sébastien Helleu <flashcode@flashtux.org>:
-# version 0.6: sync with last API changes
-# 2009-03-22, Sébastien Helleu <flashcode@flashtux.org>:
-# version 0.5: update modifier signal name for input text display,
-# fix arguments for function string_remove_color
-# 2009-02-18, Sébastien Helleu <flashcode@flashtux.org>:
-# version 0.4: do not hook command and init options if register failed
-# 2009-02-08, Sébastien Helleu <flashcode@flashtux.org>:
-# version 0.3: case insensitive search for buffers names
-# 2009-02-08, Sébastien Helleu <flashcode@flashtux.org>:
-# version 0.2: add help about Tab key
-# 2009-02-08, Sébastien Helleu <flashcode@flashtux.org>:
-# version 0.1: initial release
-#
-
-"""
-Quick jump to buffers.
-(this script requires WeeChat 0.3.0 or newer)
-"""
-
-from __future__ import print_function
-
-SCRIPT_NAME = 'go'
-SCRIPT_AUTHOR = 'Sébastien Helleu <flashcode@flashtux.org>'
-SCRIPT_VERSION = '2.5'
-SCRIPT_LICENSE = 'GPL3'
-SCRIPT_DESC = 'Quick jump to buffers'
-
-SCRIPT_COMMAND = 'go'
-
-IMPORT_OK = True
-
-try:
- import weechat
-except ImportError:
- print('This script must be run under WeeChat.')
- print('Get WeeChat now at: http://www.weechat.org/')
- IMPORT_OK = False
-
-import re
-
-# script options
-SETTINGS = {
- 'color_number': (
- 'yellow,magenta',
- 'color for buffer number (not selected)'),
- 'color_number_selected': (
- 'yellow,red',
- 'color for selected buffer number'),
- 'color_name': (
- 'black,cyan',
- 'color for buffer name (not selected)'),
- 'color_name_selected': (
- 'black,brown',
- 'color for a selected buffer name'),
- 'color_name_highlight': (
- 'red,cyan',
- 'color for highlight in buffer name (not selected)'),
- 'color_name_highlight_selected': (
- 'red,brown',
- 'color for highlight in a selected buffer name'),
- 'message': (
- 'Go to: ',
- 'message to display before list of buffers'),
- 'short_name': (
- 'off',
- 'display and search in short names instead of buffer name'),
- 'sort': (
- 'number,beginning',
- 'comma-separated list of keys to sort buffers '
- '(the order is important, sorts are performed in the given order): '
- 'name = sort by name (or short name), ',
- 'hotlist = sort by hotlist order, '
- 'number = first match a buffer number before digits in name, '
- 'beginning = first match at beginning of names (or short names); '
- 'the default sort of buffers is by numbers'),
- 'use_core_instead_weechat': (
- 'off',
- 'use name "core" instead of "weechat" for core buffer'),
- 'auto_jump': (
- 'off',
- 'automatically jump to buffer when it is uniquely selected'),
- 'fuzzy_search': (
- 'off',
- 'search buffer matches using approximation'),
- 'buffer_number': (
- 'on',
- 'display buffer number'),
-}
-
-# hooks management
-HOOK_COMMAND_RUN = {
- 'input': ('/input *', 'go_command_run_input'),
- 'buffer': ('/buffer *', 'go_command_run_buffer'),
- 'window': ('/window *', 'go_command_run_window'),
-}
-hooks = {}
-
-# input before command /go (we'll restore it later)
-saved_input = ''
-saved_input_pos = 0
-
-# last user input (if changed, we'll update list of matching buffers)
-old_input = None
-
-# matching buffers
-buffers = []
-buffers_pos = 0
-
-
-def go_option_enabled(option):
- """Checks if a boolean script option is enabled or not."""
- return weechat.config_string_to_boolean(weechat.config_get_plugin(option))
-
-
-def go_info_running(data, info_name, arguments):
- """Returns "1" if go is running, otherwise "0"."""
- return '1' if 'modifier' in hooks else '0'
-
-
-def go_unhook_one(hook):
- """Unhook something hooked by this script."""
- global hooks
- if hook in hooks:
- weechat.unhook(hooks[hook])
- del hooks[hook]
-
-
-def go_unhook_all():
- """Unhook all."""
- go_unhook_one('modifier')
- for hook in HOOK_COMMAND_RUN:
- go_unhook_one(hook)
-
-
-def go_hook_all():
- """Hook command_run and modifier."""
- global hooks
- priority = ''
- version = weechat.info_get('version_number', '') or 0
- # use high priority for hook to prevent conflict with other plugins/scripts
- # (WeeChat >= 0.3.4 only)
- if int(version) >= 0x00030400:
- priority = '2000|'
- for hook, value in HOOK_COMMAND_RUN.items():
- if hook not in hooks:
- hooks[hook] = weechat.hook_command_run(
- '%s%s' % (priority, value[0]),
- value[1], '')
- if 'modifier' not in hooks:
- hooks['modifier'] = weechat.hook_modifier(
- 'input_text_display_with_cursor', 'go_input_modifier', '')
-
-
-def go_start(buf):
- """Start go on buffer."""
- global saved_input, saved_input_pos, old_input, buffers_pos
- go_hook_all()
- saved_input = weechat.buffer_get_string(buf, 'input')
- saved_input_pos = weechat.buffer_get_integer(buf, 'input_pos')
- weechat.buffer_set(buf, 'input', '')
- old_input = None
- buffers_pos = 0
-
-
-def go_end(buf):
- """End go on buffer."""
- global saved_input, saved_input_pos, old_input
- go_unhook_all()
- weechat.buffer_set(buf, 'input', saved_input)
- weechat.buffer_set(buf, 'input_pos', str(saved_input_pos))
- old_input = None
-
-
-def go_match_beginning(buf, string):
- """Check if a string matches the beginning of buffer name/short name."""
- if not string:
- return False
- esc_str = re.escape(string)
- if re.search(r'^#?' + esc_str, buf['name']) \
- or re.search(r'^#?' + esc_str, buf['short_name']):
- return True
- return False
-
-
-def go_match_fuzzy(name, string):
- """Check if string matches name using approximation."""
- if not string:
- return False
-
- name_len = len(name)
- string_len = len(string)
-
- if string_len > name_len:
- return False
- if name_len == string_len:
- return name == string
-
- # Attempt to match all chars somewhere in name
- prev_index = -1
- for i, char in enumerate(string):
- index = name.find(char, prev_index+1)
- if index == -1:
- return False
- prev_index = index
- return True
-
-
-def go_now(buf, args):
- """Go to buffer specified by args."""
- listbuf = go_matching_buffers(args)
- if not listbuf:
- return
-
- # prefer buffer that matches at beginning (if option is enabled)
- if 'beginning' in weechat.config_get_plugin('sort').split(','):
- for index in range(len(listbuf)):
- if go_match_beginning(listbuf[index], args):
- weechat.command(buf,
- '/buffer ' + str(listbuf[index]['full_name']))
- return
-
- # jump to first buffer in matching buffers by default
- weechat.command(buf, '/buffer ' + str(listbuf[0]['full_name']))
-
-
-def go_cmd(data, buf, args):
- """Command "/go": just hook what we need."""
- global hooks
- if args:
- go_now(buf, args)
- elif 'modifier' in hooks:
- go_end(buf)
- else:
- go_start(buf)
- return weechat.WEECHAT_RC_OK
-
-
-def go_matching_buffers(strinput):
- """Return a list with buffers matching user input."""
- global buffers_pos
- listbuf = []
- if len(strinput) == 0:
- buffers_pos = 0
- strinput = strinput.lower()
- infolist = weechat.infolist_get('buffer', '', '')
- while weechat.infolist_next(infolist):
- short_name = weechat.infolist_string(infolist, 'short_name')
- if go_option_enabled('short_name'):
- name = weechat.infolist_string(infolist, 'short_name')
- else:
- name = weechat.infolist_string(infolist, 'name')
- if name == 'weechat' \
- and go_option_enabled('use_core_instead_weechat') \
- and weechat.infolist_string(infolist, 'plugin_name') == 'core':
- name = 'core'
- number = weechat.infolist_integer(infolist, 'number')
- full_name = weechat.infolist_string(infolist, 'full_name')
- if not full_name:
- full_name = '%s.%s' % (
- weechat.infolist_string(infolist, 'plugin_name'),
- weechat.infolist_string(infolist, 'name'))
- pointer = weechat.infolist_pointer(infolist, 'pointer')
- matching = name.lower().find(strinput) >= 0
- if not matching and strinput[-1] == ' ':
- matching = name.lower().endswith(strinput.strip())
- if not matching and go_option_enabled('fuzzy_search'):
- matching = go_match_fuzzy(name.lower(), strinput)
- if not matching and strinput.isdigit():
- matching = str(number).startswith(strinput)
- if len(strinput) == 0 or matching:
- listbuf.append({
- 'number': number,
- 'short_name': short_name,
- 'name': name,
- 'full_name': full_name,
- 'pointer': pointer,
- })
- weechat.infolist_free(infolist)
-
- # sort buffers
- hotlist = []
- infolist = weechat.infolist_get('hotlist', '', '')
- while weechat.infolist_next(infolist):
- hotlist.append(
- weechat.infolist_pointer(infolist, 'buffer_pointer'))
- weechat.infolist_free(infolist)
- last_index_hotlist = len(hotlist)
-
- def _sort_name(buf):
- """Sort buffers by name (or short name)."""
- return buf['name']
-
- def _sort_hotlist(buf):
- """Sort buffers by hotlist order."""
- try:
- return hotlist.index(buf['pointer'])
- except ValueError:
- # not in hotlist, always last.
- return last_index_hotlist
-
- def _sort_match_number(buf):
- """Sort buffers by match on number."""
- return 0 if str(buf['number']) == strinput else 1
-
- def _sort_match_beginning(buf):
- """Sort buffers by match at beginning."""
- return 0 if go_match_beginning(buf, strinput) else 1
-
- funcs = {
- 'name': _sort_name,
- 'hotlist': _sort_hotlist,
- 'number': _sort_match_number,
- 'beginning': _sort_match_beginning,
- }
-
- for key in weechat.config_get_plugin('sort').split(','):
- if key in funcs:
- listbuf = sorted(listbuf, key=funcs[key])
-
- if not strinput:
- index = [i for i, buf in enumerate(listbuf)
- if buf['pointer'] == weechat.current_buffer()]
- if index:
- buffers_pos = index[0]
-
- return listbuf
-
-
-def go_buffers_to_string(listbuf, pos, strinput):
- """Return string built with list of buffers found (matching user input)."""
- string = ''
- strinput = strinput.lower()
- for i in range(len(listbuf)):
- selected = '_selected' if i == pos else ''
- buffer_name = listbuf[i]['name']
- index = buffer_name.lower().find(strinput)
- if index >= 0:
- index2 = index + len(strinput)
- name = '%s%s%s%s%s' % (
- buffer_name[:index],
- weechat.color(weechat.config_get_plugin(
- 'color_name_highlight' + selected)),
- buffer_name[index:index2],
- weechat.color(weechat.config_get_plugin(
- 'color_name' + selected)),
- buffer_name[index2:])
- elif go_option_enabled("fuzzy_search") and \
- go_match_fuzzy(buffer_name.lower(), strinput):
- name = ""
- prev_index = -1
- for char in strinput.lower():
- index = buffer_name.lower().find(char, prev_index+1)
- if prev_index < 0:
- name += buffer_name[:index]
- name += weechat.color(weechat.config_get_plugin(
- 'color_name_highlight' + selected))
- if prev_index >= 0 and index > prev_index+1:
- name += weechat.color(weechat.config_get_plugin(
- 'color_name' + selected))
- name += buffer_name[prev_index+1:index]
- name += weechat.color(weechat.config_get_plugin(
- 'color_name_highlight' + selected))
- name += buffer_name[index]
- prev_index = index
-
- name += weechat.color(weechat.config_get_plugin(
- 'color_name' + selected))
- name += buffer_name[prev_index+1:]
- else:
- name = buffer_name
- string += ' '
- if go_option_enabled('buffer_number'):
- string += '%s%s' % (
- weechat.color(weechat.config_get_plugin(
- 'color_number' + selected)),
- str(listbuf[i]['number']))
- string += '%s%s%s' % (
- weechat.color(weechat.config_get_plugin(
- 'color_name' + selected)),
- name,
- weechat.color('reset'))
- return ' ' + string if string else ''
-
-
-def go_input_modifier(data, modifier, modifier_data, string):
- """This modifier is called when input text item is built by WeeChat.
-
- This is commonly called after changes in input or cursor move: it builds
- a new input with prefix ("Go to:"), and suffix (list of buffers found).
- """
- global old_input, buffers, buffers_pos
- if modifier_data != weechat.current_buffer():
- return ''
- names = ''
- new_input = weechat.string_remove_color(string, '')
- new_input = new_input.lstrip()
- if old_input is None or new_input != old_input:
- old_buffers = buffers
- buffers = go_matching_buffers(new_input)
- if buffers != old_buffers and len(new_input) > 0:
- if len(buffers) == 1 and go_option_enabled('auto_jump'):
- weechat.command(modifier_data, '/wait 1ms /input return')
- buffers_pos = 0
- old_input = new_input
- names = go_buffers_to_string(buffers, buffers_pos, new_input.strip())
- return weechat.config_get_plugin('message') + string + names
-
-
-def go_command_run_input(data, buf, command):
- """Function called when a command "/input xxx" is run."""
- global buffers, buffers_pos
- if command == '/input search_text' or command.find('/input jump') == 0:
- # search text or jump to another buffer is forbidden now
- return weechat.WEECHAT_RC_OK_EAT
- elif command == '/input complete_next':
- # choose next buffer in list
- buffers_pos += 1
- if buffers_pos >= len(buffers):
- buffers_pos = 0
- weechat.hook_signal_send('input_text_changed',
- weechat.WEECHAT_HOOK_SIGNAL_STRING, '')
- return weechat.WEECHAT_RC_OK_EAT
- elif command == '/input complete_previous':
- # choose previous buffer in list
- buffers_pos -= 1
- if buffers_pos < 0:
- buffers_pos = len(buffers) - 1
- weechat.hook_signal_send('input_text_changed',
- weechat.WEECHAT_HOOK_SIGNAL_STRING, '')
- return weechat.WEECHAT_RC_OK_EAT
- elif command == '/input return':
- # switch to selected buffer (if any)
- go_end(buf)
- if len(buffers) > 0:
- weechat.command(
- buf, '/buffer ' + str(buffers[buffers_pos]['full_name']))
- return weechat.WEECHAT_RC_OK_EAT
- return weechat.WEECHAT_RC_OK
-
-
-def go_command_run_buffer(data, buf, command):
- """Function called when a command "/buffer xxx" is run."""
- return weechat.WEECHAT_RC_OK_EAT
-
-
-def go_command_run_window(data, buf, command):
- """Function called when a command "/window xxx" is run."""
- return weechat.WEECHAT_RC_OK_EAT
-
-
-def go_unload_script():
- """Function called when script is unloaded."""
- go_unhook_all()
- return weechat.WEECHAT_RC_OK
-
-
-def go_main():
- """Entry point."""
- if not weechat.register(SCRIPT_NAME, SCRIPT_AUTHOR, SCRIPT_VERSION,
- SCRIPT_LICENSE, SCRIPT_DESC,
- 'go_unload_script', ''):
- return
- weechat.hook_command(
- SCRIPT_COMMAND,
- 'Quick jump to buffers', '[name]',
- 'name: directly jump to buffer by name (without argument, list is '
- 'displayed)\n\n'
- 'You can bind command to a key, for example:\n'
- ' /key bind meta-g /go\n\n'
- 'You can use completion key (commonly Tab and shift-Tab) to select '
- 'next/previous buffer in list.',
- '%(buffers_names)',
- 'go_cmd', '')
-
- # set default settings
- version = weechat.info_get('version_number', '') or 0
- for option, value in SETTINGS.items():
- if not weechat.config_is_set_plugin(option):
- weechat.config_set_plugin(option, value[0])
- if int(version) >= 0x00030500:
- weechat.config_set_desc_plugin(
- option, '%s (default: "%s")' % (value[1], value[0]))
- weechat.hook_info('go_running',
- 'Return "1" if go is running, otherwise "0"',
- '',
- 'go_info_running', '')
-
-
-if __name__ == "__main__" and IMPORT_OK:
- go_main()
diff --git a/.weechat/python/autoload/urlserver.py b/.weechat/python/autoload/urlserver.py
deleted file mode 120000
index 319fd20d..00000000
--- a/.weechat/python/autoload/urlserver.py
+++ /dev/null
@@ -1 +0,0 @@
-../urlserver.py
\ No newline at end of file
diff --git a/.weechat/python/autosort.py b/.weechat/python/autosort.py
deleted file mode 100644
index 6854b9e6..00000000
--- a/.weechat/python/autosort.py
+++ /dev/null
@@ -1,885 +0,0 @@
-# -*- coding: utf-8 -*-
-#
-# Copyright (C) 2013-2014 Maarten de Vries <maarten@de-vri.es>
-#
-# This program is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 3 of the License, or
-# (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program. If not, see <http://www.gnu.org/licenses/>.
-#
-
-#
-# Autosort automatically keeps your buffers sorted and grouped by server.
-# You can define your own sorting rules. See /help autosort for more details.
-#
-# http://github.com/de-vri.es/weechat-autosort
-#
-
-#
-# Changelog:
-# 2.8:
-# * Fix compatibility with python 3 regarding unicode handling.
-# 2.7:
-# * Fix sorting of buffers with spaces in their name.
-# 2.6:
-# * Ignore case in rules when doing case insensitive sorting.
-# 2.5:
-# * Fix handling unicode buffer names.
-# * Add hint to set irc.look.server_buffer to independent and buffers.look.indenting to on.
-# 2.4:
-# * Make script python3 compatible.
-# 2.3:
-# * Fix sorting items without score last (regressed in 2.2).
-# 2.2:
-# * Add configuration option for signals that trigger a sort.
-# * Add command to manually trigger a sort (/autosort sort).
-# * Add replacement patterns to apply before sorting.
-# 2.1:
-# * Fix some minor style issues.
-# 2.0:
-# * Allow for custom sort rules.
-#
-
-
-import weechat
-import re
-import json
-
-SCRIPT_NAME = 'autosort'
-SCRIPT_AUTHOR = 'Maarten de Vries <maarten@de-vri.es>'
-SCRIPT_VERSION = '2.8'
-SCRIPT_LICENSE = 'GPL3'
-SCRIPT_DESC = 'Automatically or manually keep your buffers sorted and grouped by server.'
-
-
-config = None
-hooks = []
-
-class HumanReadableError(Exception):
- pass
-
-
-def parse_int(arg, arg_name = 'argument'):
- ''' Parse an integer and provide a more human readable error. '''
- arg = arg.strip()
- try:
- return int(arg)
- except ValueError:
- raise HumanReadableError('Invalid {0}: expected integer, got "{1}".'.format(arg_name, arg))
-
-
-class Pattern:
- ''' A simple glob-like pattern for matching buffer names. '''
-
- def __init__(self, pattern, case_sensitive):
- ''' Construct a pattern from a string. '''
- escaped = False
- char_class = 0
- chars = ''
- regex = ''
- for c in pattern:
- if escaped and char_class:
- escaped = False
- chars += re.escape(c)
- elif escaped:
- escaped = False
- regex += re.escape(c)
- elif c == '\\':
- escaped = True
- elif c == '*' and not char_class:
- regex += '[^.]*'
- elif c == '?' and not char_class:
- regex += '[^.]'
- elif c == '[' and not char_class:
- char_class = 1
- chars = ''
- elif c == '^' and char_class and not chars:
- chars += '^'
- elif c == ']' and char_class and chars not in ('', '^'):
- char_class = False
- regex += '[' + chars + ']'
- elif c == '-' and char_class:
- chars += '-'
- elif char_class:
- chars += re.escape(c)
- else:
- regex += re.escape(c)
-
- if char_class:
- raise ValueError("unmatched opening '['")
- if escaped:
- raise ValueError("unexpected trailing '\\'")
-
- if case_sensitive:
- self.regex = re.compile('^' + regex + '$')
- else:
- self.regex = re.compile('^' + regex + '$', flags = re.IGNORECASE)
- self.pattern = pattern
-
- def match(self, input):
- ''' Match the pattern against a string. '''
- return self.regex.match(input)
-
-
-class FriendlyList(object):
- ''' A list with human readable errors. '''
-
- def __init__(self):
- self.__data = []
-
- def raw(self):
- return self.__data
-
- def append(self, value):
- ''' Add a rule to the list. '''
- self.__data.append(value)
-
- def insert(self, index, value):
- ''' Add a rule to the list. '''
- if not 0 <= index <= len(self): raise HumanReadableError('Index out of range: expected an integer in the range [0, {0}], got {1}.'.format(len(self), index))
- self.__data.insert(index, value)
-
- def pop(self, index):
- ''' Remove a rule from the list and return it. '''
- if not 0 <= index < len(self): raise HumanReadableError('Index out of range: expected an integer in the range [0, {0}), got {1}.'.format(len(self), index))
- return self.__data.pop(index)
-
- def move(self, index_a, index_b):
- ''' Move a rule to a new position in the list. '''
- self.insert(index_b, self.pop(index_a))
-
- def swap(self, index_a, index_b):
- ''' Swap two elements in the list. '''
- self[index_a], self[index_b] = self[index_b], self[index_a]
-
- def __len__(self):
- return len(self.__data)
-
- def __getitem__(self, index):
- if not 0 <= index < len(self): raise HumanReadableError('Index out of range: expected an integer in the range [0, {0}), got {1}.'.format(len(self), index))
- return self.__data[index]
-
- def __setitem__(self, index, value):
- if not 0 <= index < len(self): raise HumanReadableError('Index out of range: expected an integer in the range [0, {0}), got {1}.'.format(len(self), index))
- self.__data[index] = value
-
- def __iter__(self):
- return iter(self.__data)
-
-
-class RuleList(FriendlyList):
- ''' A list of rules to test buffer names against. '''
- rule_regex = re.compile(r'^(.*)=\s*([+-]?[^=]*)$')
-
- def __init__(self, rules):
- ''' Construct a RuleList from a list of rules. '''
- super(RuleList, self).__init__()
- for rule in rules: self.append(rule)
-
- def get_score(self, name):
- ''' Get the sort score of a partial name according to a rule list. '''
- for rule in self:
- if rule[0].match(name): return rule[1]
- return 999999999
-
- def encode(self):
- ''' Encode the rules for storage. '''
- return json.dumps(list(map(lambda x: (x[0].pattern, x[1]), self)))
-
- @staticmethod
- def decode(blob, case_sensitive):
- ''' Parse rules from a string blob. '''
- result = []
-
- try:
- decoded = json.loads(blob)
- except ValueError:
- log('Invalid rules: expected JSON encoded list of pairs, got "{0}".'.format(blob))
- return [], 0
-
- for rule in decoded:
- # Rules must be a pattern,score pair.
- if len(rule) != 2:
- log('Invalid rule: expected (pattern, score), got "{0}". Rule ignored.'.format(rule))
- continue
-
- # Rules must have a valid pattern.
- try:
- pattern = Pattern(rule[0], case_sensitive)
- except ValueError as e:
- log('Invalid pattern: {0} in "{1}". Rule ignored.'.format(e, rule[0]))
- continue
-
- # Rules must have a valid score.
- try:
- score = int(rule[1])
- except ValueError as e:
- log('Invalid score: expected an integer, got "{0}". Rule ignored.'.format(score))
- continue
-
- result.append((pattern, score))
-
- return RuleList(result)
-
- @staticmethod
- def parse_rule(arg, case_sensitive):
- ''' Parse a rule argument. '''
- arg = arg.strip()
- match = RuleList.rule_regex.match(arg)
- if not match:
- raise HumanReadableError('Invalid rule: expected "<pattern> = <score>", got "{0}".'.format(arg))
-
- pattern = match.group(1).strip()
- try:
- pattern = Pattern(pattern, case_sensitive)
- except ValueError as e:
- raise HumanReadableError('Invalid pattern: {0} in "{1}".'.format(e, pattern))
-
- score = parse_int(match.group(2), 'score')
- return (pattern, score)
-
-
-def decode_replacements(blob):
- ''' Decode a replacement list encoded as JSON. '''
- result = FriendlyList()
- try:
- decoded = json.loads(blob)
- except ValueError:
- log('Invalid replacement list: expected JSON encoded list of pairs, got "{0}".'.format(blob))
- return [], 0
-
- for replacement in decoded:
- # Replacements must be a (string, string) pair.
- if len(replacement) != 2:
- log('Invalid replacement pattern: expected (pattern, replacement), got "{0}". Replacement ignored.'.format(rule))
- continue
- result.append(replacement)
-
- return result
-
-
-def encode_replacements(replacements):
- ''' Encode a list of replacement patterns as JSON. '''
- return json.dumps(replacements.raw())
-
-
-class Config:
- ''' The autosort configuration. '''
-
- default_rules = json.dumps([
- ('core', 0),
- ('irc', 2),
- ('*', 1),
-
- ('irc.irc_raw', 0),
- ('irc.server', 1),
- ])
-
- default_replacements = '[]'
- default_signals = 'buffer_opened buffer_merged buffer_unmerged buffer_renamed'
-
- def __init__(self, filename):
- ''' Initialize the configuration. '''
-
- self.filename = filename
- self.config_file = weechat.config_new(self.filename, '', '')
- self.sorting_section = None
-
- self.case_sensitive = False
- self.group_irc = True
- self.rules = []
- self.replacements = []
- self.signals = []
- self.sort_on_config = True
-
- self.__case_sensitive = None
- self.__group_irc = None
- self.__rules = None
- self.__replacements = None
- self.__signals = None
- self.__sort_on_config = None
-
- if not self.config_file:
- log('Failed to initialize configuration file "{0}".'.format(self.filename))
- return
-
- self.sorting_section = weechat.config_new_section(self.config_file, 'sorting', False, False, '', '', '', '', '', '', '', '', '', '')
-
- if not self.sorting_section:
- log('Failed to initialize section "sorting" of configuration file.')
- weechat.config_free(self.config_file)
- return
-
- self.__case_sensitive = weechat.config_new_option(
- self.config_file, self.sorting_section,
- 'case_sensitive', 'boolean',
- 'If this option is on, sorting is case sensitive.',
- '', 0, 0, 'off', 'off', 0,
- '', '', '', '', '', ''
- )
-
- self.__group_irc = weechat.config_new_option(
- self.config_file, self.sorting_section,
- 'group_irc', 'boolean',
- 'If this option is on, the script pretends that IRC channel/private buffers are renamed to "irc.server.{network}.{channel}" rather than "irc.{network}.{channel}".' +
- 'This ensures that these buffers are grouped with their respective server buffer.',
- '', 0, 0, 'on', 'on', 0,
- '', '', '', '', '', ''
- )
-
- self.__rules = weechat.config_new_option(
- self.config_file, self.sorting_section,
- 'rules', 'string',
- 'An ordered list of sorting rules encoded as JSON. See /help autosort for commands to manipulate these rules.',
- '', 0, 0, Config.default_rules, Config.default_rules, 0,
- '', '', '', '', '', ''
- )
-
- self.__replacements = weechat.config_new_option(
- self.config_file, self.sorting_section,
- 'replacements', 'string',
- 'An ordered list of replacement patterns to use on buffer name components, encoded as JSON. See /help autosort for commands to manipulate these replacements.',
- '', 0, 0, Config.default_replacements, Config.default_replacements, 0,
- '', '', '', '', '', ''
- )
-
- self.__signals = weechat.config_new_option(
- self.config_file, self.sorting_section,
- 'signals', 'string',
- 'The signals that will cause autosort to resort your buffer list. Seperate signals with spaces.',
- '', 0, 0, Config.default_signals, Config.default_signals, 0,
- '', '', '', '', '', ''
- )
-
- self.__sort_on_config = weechat.config_new_option(
- self.config_file, self.sorting_section,
- 'sort_on_config_change', 'boolean',
- 'Decides if the buffer list should be sorted when autosort configuration changes.',
- '', 0, 0, 'on', 'on', 0,
- '', '', '', '', '', ''
- )
-
- if weechat.config_read(self.config_file) != weechat.WEECHAT_RC_OK:
- log('Failed to load configuration file.')
-
- if weechat.config_write(self.config_file) != weechat.WEECHAT_RC_OK:
- log('Failed to write configuration file.')
-
- self.reload()
-
- def reload(self):
- ''' Load configuration variables. '''
-
- self.case_sensitive = weechat.config_boolean(self.__case_sensitive)
- self.group_irc = weechat.config_boolean(self.__group_irc)
-
- rules_blob = weechat.config_string(self.__rules)
- replacements_blob = weechat.config_string(self.__replacements)
- signals_blob = weechat.config_string(self.__signals)
-
- self.rules = RuleList.decode(rules_blob, self.case_sensitive)
- self.replacements = decode_replacements(replacements_blob)
- self.signals = signals_blob.split()
- self.sort_on_config = weechat.config_boolean(self.__sort_on_config)
-
- def save_rules(self, run_callback = True):
- ''' Save the current rules to the configuration. '''
- weechat.config_option_set(self.__rules, RuleList.encode(self.rules), run_callback)
-
- def save_replacements(self, run_callback = True):
- ''' Save the current replacement patterns to the configuration. '''
- weechat.config_option_set(self.__replacements, encode_replacements(self.replacements), run_callback)
-
-
-def pad(sequence, length, padding = None):
- ''' Pad a list until is has a certain length. '''
- return sequence + [padding] * max(0, (length - len(sequence)))
-
-
-def log(message, buffer = 'NULL'):
- weechat.prnt(buffer, 'autosort: {0}'.format(message))
-
-
-def get_buffers():
- ''' Get a list of all the buffers in weechat. '''
- buffers = []
-
- buffer_list = weechat.infolist_get('buffer', '', '')
-
- while weechat.infolist_next(buffer_list):
- name = weechat.infolist_string (buffer_list, 'full_name')
- number = weechat.infolist_integer(buffer_list, 'number')
-
- # Buffer is merged with one we already have in the list, skip it.
- if number <= len(buffers):
- continue
- buffers.append((name, number - 1))
-
- weechat.infolist_free(buffer_list)
- return buffers
-
-
-def preprocess(buffer, config):
- '''
- Preprocess a buffers names.
- '''
-
- # Make sure the name is a unicode string.
- # On python3 this is a NOP since the string type is already decoded as UTF-8.
- if isinstance(buffer, bytes):
- buffer = buffer.decode('utf-8')
-
- if not config.case_sensitive:
- buffer = buffer.lower()
-
- for replacement in config.replacements:
- buffer = buffer.replace(replacement[0], replacement[1])
-
- buffer = buffer.split('.')
- if config.group_irc and len(buffer) >= 2 and buffer[0] == 'irc' and buffer[1] not in ('server', 'irc_raw'):
- buffer.insert(1, 'server')
-
- return buffer
-
-
-def buffer_sort_key(rules):
- ''' Create a sort key function for a buffer list from a rule list. '''
- def key(buffer):
- result = []
- name = ''
- for word in preprocess(buffer[0], config):
- name += ('.' if name else '') + word
- result.append((rules.get_score(name), word))
- return result
-
- return key
-
-
-def apply_buffer_order(order):
- ''' Sort the buffers in weechat according to the given order. '''
- indices = list(order)
- reverse = [0] * len(indices)
- for i, index in enumerate(indices):
- reverse[index] = i
-
- for i in range(len(indices)):
- wanted = indices[i]
- if wanted == i: continue
- # Weechat buffers are 1-indexed, but our indices aren't.
- weechat.command('', '/buffer swap {0} {1}'.format(i + 1, wanted + 1))
- indices[reverse[i]] = wanted
- reverse[wanted] = reverse[i]
-
-
-def split_args(args, expected, optional = 0):
- ''' Split an argument string in the desired number of arguments. '''
- split = args.split(' ', expected - 1)
- if (len(split) < expected):
- raise HumanReadableError('Expected at least {0} arguments, got {1}.'.format(expected, len(split)))
- return split[:-1] + pad(split[-1].split(' ', optional), optional + 1, '')
-
-
-def command_sort(buffer, command, args):
- ''' Sort the buffers and print a confirmation. '''
- on_buffers_changed()
- log("Finished sorting buffers.", buffer)
- return weechat.WEECHAT_RC_OK
-
-
-def command_rule_list(buffer, command, args):
- ''' Show the list of sorting rules. '''
- output = 'Sorting rules:\n'
- for i, rule in enumerate(config.rules):
- output += ' {0}: {1} = {2}\n'.format(i, rule[0].pattern, rule[1])
- if not len(config.rules):
- output += ' No sorting rules configured.\n'
- log(output, buffer)
-
- return weechat.WEECHAT_RC_OK
-
-
-def command_rule_add(buffer, command, args):
- ''' Add a rule to the rule list. '''
- rule = RuleList.parse_rule(args, config.case_sensitive)
-
- config.rules.append(rule)
- config.save_rules()
- command_rule_list(buffer, command, '')
-
- return weechat.WEECHAT_RC_OK
-
-
-def command_rule_insert(buffer, command, args):
- ''' Insert a rule at the desired position in the rule list. '''
- index, rule = split_args(args, 2)
- index = parse_int(index, 'index')
- rule = RuleList.parse_rule(rule, config.case_sensitive)
-
- config.rules.insert(index, rule)
- config.save_rules()
- command_rule_list(buffer, command, '')
- return weechat.WEECHAT_RC_OK
-
-
-def command_rule_update(buffer, command, args):
- ''' Update a rule in the rule list. '''
- index, rule = split_args(args, 2)
- index = parse_int(index, 'index')
- rule = RuleList.parse_rule(rule, config.case_sensitive)
-
- config.rules[index] = rule
- config.save_rules()
- command_rule_list(buffer, command, '')
- return weechat.WEECHAT_RC_OK
-
-
-def command_rule_delete(buffer, command, args):
- ''' Delete a rule from the rule list. '''
- index = args.strip()
- index = parse_int(index, 'index')
-
- config.rules.pop(index)
- config.save_rules()
- command_rule_list(buffer, command, '')
- return weechat.WEECHAT_RC_OK
-
-
-def command_rule_move(buffer, command, args):
- ''' Move a rule to a new position. '''
- index_a, index_b = split_args(args, 2)
- index_a = parse_int(index_a, 'index')
- index_b = parse_int(index_b, 'index')
-
- config.rules.move(index_a, index_b)
- config.save_rules()
- command_rule_list(buffer, command, '')
- return weechat.WEECHAT_RC_OK
-
-
-def command_rule_swap(buffer, command, args):
- ''' Swap two rules. '''
- index_a, index_b = split_args(args, 2)
- index_a = parse_int(index_a, 'index')
- index_b = parse_int(index_b, 'index')
-
- config.rules.swap(index_a, index_b)
- config.save_rules()
- command_rule_list(buffer, command, '')
- return weechat.WEECHAT_RC_OK
-
-
-def command_replacement_list(buffer, command, args):
- ''' Show the list of sorting rules. '''
- output = 'Replacement patterns:\n'
- for i, pattern in enumerate(config.replacements):
- output += ' {0}: {1} -> {2}\n'.format(i, pattern[0], pattern[1])
- if not len(config.replacements):
- output += ' No replacement patterns configured.'
- log(output, buffer)
-
- return weechat.WEECHAT_RC_OK
-
-
-def command_replacement_add(buffer, command, args):
- ''' Add a rule to the rule list. '''
- pattern, replacement = split_args(args, 1, 1)
-
- config.replacements.append((pattern, replacement))
- config.save_replacements()
- command_replacement_list(buffer, command, '')
-
- return weechat.WEECHAT_RC_OK
-
-
-def command_replacement_insert(buffer, command, args):
- ''' Insert a rule at the desired position in the rule list. '''
- index, pattern, replacement = split_args(args, 2, 1)
- index = parse_int(index, 'index')
-
- config.replacements.insert(index, (pattern, replacement))
- config.save_replacements()
- command_replacement_list(buffer, command, '')
- return weechat.WEECHAT_RC_OK
-
-
-def command_replacement_update(buffer, command, args):
- ''' Update a rule in the rule list. '''
- index, pattern, replacement = split_args(args, 2, 1)
- index = parse_int(index, 'index')
-
- config.replacements[index] = (pattern, replacement)
- config.save_replacements()
- command_replacement_list(buffer, command, '')
- return weechat.WEECHAT_RC_OK
-
-
-def command_replacement_delete(buffer, command, args):
- ''' Delete a rule from the rule list. '''
- index = args.strip()
- index = parse_int(index, 'index')
-
- config.replacements.pop(index)
- config.save_replacements()
- command_replacement_list(buffer, command, '')
- return weechat.WEECHAT_RC_OK
-
-
-def command_replacement_move(buffer, command, args):
- ''' Move a rule to a new position. '''
- index_a, index_b = split_args(args, 2)
- index_a = parse_int(index_a, 'index')
- index_b = parse_int(index_b, 'index')
-
- config.replacements.move(index_a, index_b)
- config.save_replacements()
- command_replacement_list(buffer, command, '')
- return weechat.WEECHAT_RC_OK
-
-
-def command_replacement_swap(buffer, command, args):
- ''' Swap two rules. '''
- index_a, index_b = split_args(args, 2)
- index_a = parse_int(index_a, 'index')
- index_b = parse_int(index_b, 'index')
-
- config.replacements.swap(index_a, index_b)
- config.save_replacements()
- command_replacement_list(buffer, command, '')
- return weechat.WEECHAT_RC_OK
-
-
-
-
-def call_command(buffer, command, args, subcommands):
- ''' Call a subccommand from a dictionary. '''
- subcommand, tail = pad(args.split(' ', 1), 2, '')
- subcommand = subcommand.strip()
- if (subcommand == ''):
- child = subcommands.get(' ')
- else:
- command = command + [subcommand]
- child = subcommands.get(subcommand)
-
- if isinstance(child, dict):
- return call_command(buffer, command, tail, child)
- elif callable(child):
- return child(buffer, command, tail)
-
- log('{0}: command not found'.format(' '.join(command)))
- return weechat.WEECHAT_RC_ERROR
-
-
-def on_buffers_changed(*args, **kwargs):
- ''' Called whenever the buffer list changes. '''
- buffers = get_buffers()
- buffers.sort(key=buffer_sort_key(config.rules))
- apply_buffer_order([i for _, i in buffers])
- return weechat.WEECHAT_RC_OK
-
-
-def on_config_changed(*args, **kwargs):
- ''' Called whenever the configuration changes. '''
- config.reload()
-
- # Unhook all signals and hook the new ones.
- for hook in hooks:
- weechat.unhook(hook)
- for signal in config.signals:
- hooks.append(weechat.hook_signal(signal, 'on_buffers_changed', ''))
-
- if config.sort_on_config:
- on_buffers_changed()
-
- return weechat.WEECHAT_RC_OK
-
-
-def on_autosort_command(data, buffer, args):
- ''' Called when the autosort command is invoked. '''
- try:
- return call_command(buffer, ['/autosort'], args, {
- ' ': command_sort,
- 'sort': command_sort,
-
- 'rules': {
- ' ': command_rule_list,
- 'list': command_rule_list,
- 'add': command_rule_add,
- 'insert': command_rule_insert,
- 'update': command_rule_update,
- 'delete': command_rule_delete,
- 'move': command_rule_move,
- 'swap': command_rule_swap,
- },
- 'replacements': {
- ' ': command_replacement_list,
- 'list': command_replacement_list,
- 'add': command_replacement_add,
- 'insert': command_replacement_insert,
- 'update': command_replacement_update,
- 'delete': command_replacement_delete,
- 'move': command_replacement_move,
- 'swap': command_replacement_swap,
- },
- 'sort': on_buffers_changed,
- })
- except HumanReadableError as e:
- log(e, buffer)
- return weechat.WEECHAT_RC_ERROR
-
-
-command_description = r'''
-NOTE: For the best effect, you may want to consider setting the option irc.look.server_buffer to independent and buffers.look.indenting to on.
-
-# Commands
-
-## Miscellaneous
-/autosort sort
-Manually trigger the buffer sorting.
-
-
-## Sorting rules
-
-/autosort rules list
-Print the list of sort rules.
-
-/autosort rules add <pattern> = <score>
-Add a new rule at the end of the list.
-
-/autosort rules insert <index> <pattern> = <score>
-Insert a new rule at the given index in the list.
-
-/autosort rules update <index> <pattern> = <score>
-Update a rule in the list with a new pattern and score.
-
-/autosort rules delete <index>
-Delete a rule from the list.
-
-/autosort rules move <index_from> <index_to>
-Move a rule from one position in the list to another.
-
-/autosort rules swap <index_a> <index_b>
-Swap two rules in the list
-
-
-## Replacement patterns
-
-/autosort replacements list
-Print the list of replacement patterns.
-
-/autosort replacements add <pattern> <replacement>
-Add a new replacement pattern at the end of the list.
-
-/autosort replacements insert <index> <pattern> <replacement>
-Insert a new replacement pattern at the given index in the list.
-
-/autosort replacements update <index> <pattern> <replacement>
-Update a replacement pattern in the list.
-
-/autosort replacements delete <index>
-Delete a replacement pattern from the list.
-
-/autosort replacements move <index_from> <index_to>
-Move a replacement pattern from one position in the list to another.
-
-/autosort replacements swap <index_a> <index_b>
-Swap two replacement pattern in the list
-
-
-# Introduction
-Autosort is a weechat script to automatically keep your buffers sorted.
-The sort order can be customized by defining your own sort rules,
-but the default should be sane enough for most people.
-It can also group IRC channel/private buffers under their server buffer if you like.
-
-Autosort first turns buffer names into a list of their components by splitting on them on the period character.
-For example, the buffer name "irc.server.freenode" is turned into ['irc', 'server', 'freenode'].
-The list of buffers is then lexicographically sorted.
-
-To facilitate custom sort orders, it is possible to assign a score to each component individually before the sorting is done.
-Any name component that did not get a score assigned will be sorted after those that did receive a score.
-Components are always sorted on their score first and on their name second.
-Lower scores are sorted first.
-
-## Automatic or manual sorting
-By default, autosort will automatically sort your buffer list whenever a buffer is opened, merged, unmerged or renamed.
-This should keep your buffers sorted in almost all situations.
-However, you may wish to change the list of signals that cause your buffer list to be sorted.
-Simply edit the "autosort.sorting.signals" option to add or remove any signal you like.
-If you remove all signals you can still sort your buffers manually with the "/autosort sort" command.
-To prevent all automatic sorting, "autosort.sorting.sort_on_config_change" should also be set to off.
-
-## Grouping IRC buffers
-In weechat, IRC channel/private buffers are named "irc.<network>.<#channel>",
-and IRC server buffers are named "irc.server.<network>".
-This does not work very well with lexicographical sorting if you want all buffers for one network grouped together.
-That is why autosort comes with the "autosort.sorting.group_irc" option,
-which secretly pretends IRC channel/private buffers are called "irc.server.<network>.<#channel>".
-The buffers are not actually renamed, autosort simply pretends they are for sorting purposes.
-
-## Replacement patterns
-Sometimes you may want to ignore some characters for sorting purposes.
-On Freenode for example, you may wish to ignore the difference between channels starting with a double or a single hash sign.
-To do so, simply add a replacement pattern that replaces ## with # with the following command:
-/autosort replacements add ## #
-
-Replacement patterns do not support wildcards or special characters at the moment.
-
-## Sort rules
-You can assign scores to name components by defining sort rules.
-The first rule that matches a component decides the score.
-Further rules are not examined.
-Sort rules use the following syntax:
-<glob-pattern> = <score>
-
-You can use the "/autosort rules" command to show and manipulate the list of sort rules.
-
-
-Allowed special characters in the glob patterns are:
-
-Pattern | Meaning
---------|--------
-* | Matches a sequence of any characters except for periods.
-? | Matches a single character, but not a period.
-[a-z] | Matches a single character in the given regex-like character class.
-[^ab] | A negated regex-like character class.
-\* | A backslash escapes the next characters and removes its special meaning.
-\\ | A literal backslash.
-
-
-## Example
-As an example, consider the following rule list:
-0: core = 0
-1: irc = 2
-2: * = 1
-
-3: irc.server.*.#* = 1
-4: irc.server.*.* = 0
-
-Rule 0 ensures the core buffer is always sorted first.
-Rule 1 sorts IRC buffers last and rule 2 puts all remaining buffers in between the two.
-
-Rule 3 and 4 would make no sense with the group_irc option off.
-With the option on though, these rules will sort private buffers before regular channel buffers.
-Rule 3 matches channel buffers and assigns them a higher score,
-while rule 4 matches the buffers that remain and assigns them a lower score.
-The same effect could also be achieved with a single rule:
-irc.server.*.[^#]* = 0
-'''
-
-command_completion = 'sort||rules list|add|insert|update|delete|move|swap||replacements list|add|insert|update|delete|move|swap'
-
-
-if weechat.register(SCRIPT_NAME, SCRIPT_AUTHOR, SCRIPT_VERSION, SCRIPT_LICENSE, SCRIPT_DESC, "", ""):
- config = Config('autosort')
-
- weechat.hook_config('autosort.*', 'on_config_changed', '')
- weechat.hook_command('autosort', command_description, '', '', command_completion, 'on_autosort_command', 'NULL')
- on_config_changed()
diff --git a/.weechat/python/colorize_nicks.py b/.weechat/python/colorize_nicks.py
deleted file mode 100644
index 1460f013..00000000
--- a/.weechat/python/colorize_nicks.py
+++ /dev/null
@@ -1,355 +0,0 @@
-# -*- coding: utf-8 -*-
-#
-# Copyright (c) 2010 by xt <xt@bash.no>
-#
-# This program is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 3 of the License, or
-# (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program. If not, see <http://www.gnu.org/licenses/>.
-#
-
-# This script colors nicks in IRC channels in the actual message
-# not just in the prefix section.
-#
-#
-# History:
-# 2017-03-01, arza <arza@arza.us>
-# version 23: don't colorize nicklist group names
-# 2016-05-01, Simmo Saan <simmo.saan@gmail.com>
-# version 22: invalidate cached colors on hash algorithm change
-# 2015-07-28, xt
-# version 21: fix problems with nicks with commas in them
-# 2015-04-19, xt
-# version 20: fix ignore of nicks in URLs
-# 2015-04-18, xt
-# version 19: new option ignore nicks in URLs
-# 2015-03-03, xt
-# version 18: iterate buffers looking for nicklists instead of servers
-# 2015-02-23, holomorph
-# version 17: fix coloring in non-channel buffers (#58)
-# 2014-09-17, holomorph
-# version 16: use weechat config facilities
-# clean unused, minor linting, some simplification
-# 2014-05-05, holomorph
-# version 15: fix python2-specific re.search check
-# 2013-01-29, nils_2
-# version 14: make script compatible with Python 3.x
-# 2012-10-19, ldvx
-# version 13: Iterate over every word to prevent incorrect colorization of
-# nicks. Added option greedy_matching.
-# 2012-04-28, ldvx
-# version 12: added ignore_tags to avoid colorizing nicks if tags are present
-# 2012-01-14, nesthib
-# version 11: input_text_display hook and modifier to colorize nicks in input bar
-# 2010-12-22, xt
-# version 10: hook config option for updating blacklist
-# 2010-12-20, xt
-# version 0.9: hook new config option for weechat 0.3.4
-# 2010-11-01, nils_2
-# version 0.8: hook_modifier() added to communicate with rainbow_text
-# 2010-10-01, xt
-# version 0.7: changes to support non-irc-plugins
-# 2010-07-29, xt
-# version 0.6: compile regexp as per patch from Chris quigybo@hotmail.com
-# 2010-07-19, xt
-# version 0.5: fix bug with incorrect coloring of own nick
-# 2010-06-02, xt
-# version 0.4: update to reflect API changes
-# 2010-03-26, xt
-# version 0.3: fix error with exception
-# 2010-03-24, xt
-# version 0.2: use ignore_channels when populating to increase performance.
-# 2010-02-03, xt
-# version 0.1: initial (based on ruby script by dominikh)
-#
-# Known issues: nicks will not get colorized if they begin with a character
-# such as ~ (which some irc networks do happen to accept)
-
-import weechat
-import re
-w = weechat
-
-SCRIPT_NAME = "colorize_nicks"
-SCRIPT_AUTHOR = "xt <xt@bash.no>"
-SCRIPT_VERSION = "23"
-SCRIPT_LICENSE = "GPL"
-SCRIPT_DESC = "Use the weechat nick colors in the chat area"
-
-VALID_NICK = r'([@~&!%+])?([-a-zA-Z0-9\[\]\\`_^\{|\}]+)'
-valid_nick_re = re.compile(VALID_NICK)
-ignore_channels = []
-ignore_nicks = []
-
-# Dict with every nick on every channel with its color as lookup value
-colored_nicks = {}
-
-CONFIG_FILE_NAME = "colorize_nicks"
-
-# config file and options
-colorize_config_file = ""
-colorize_config_option = {}
-
-def colorize_config_init():
- '''
- Initialization of configuration file.
- Sections: look.
- '''
- global colorize_config_file, colorize_config_option
- colorize_config_file = weechat.config_new(CONFIG_FILE_NAME,
- "colorize_config_reload_cb", "")
- if colorize_config_file == "":
- return
-
- # section "look"
- section_look = weechat.config_new_section(
- colorize_config_file, "look", 0, 0, "", "", "", "", "", "", "", "", "", "")
- if section_look == "":
- weechat.config_free(colorize_config_file)
- return
- colorize_config_option["blacklist_channels"] = weechat.config_new_option(
- colorize_config_file, section_look, "blacklist_channels",
- "string", "Comma separated list of channels", "", 0, 0,
- "", "", 0, "", "", "", "", "", "")
- colorize_config_option["blacklist_nicks"] = weechat.config_new_option(
- colorize_config_file, section_look, "blacklist_nicks",
- "string", "Comma separated list of nicks", "", 0, 0,
- "so,root", "so,root", 0, "", "", "", "", "", "")
- colorize_config_option["min_nick_length"] = weechat.config_new_option(
- colorize_config_file, section_look, "min_nick_length",
- "integer", "Minimum length nick to colorize", "",
- 2, 20, "", "", 0, "", "", "", "", "", "")
- colorize_config_option["colorize_input"] = weechat.config_new_option(
- colorize_config_file, section_look, "colorize_input",
- "boolean", "Whether to colorize input", "", 0,
- 0, "off", "off", 0, "", "", "", "", "", "")
- colorize_config_option["ignore_tags"] = weechat.config_new_option(
- colorize_config_file, section_look, "ignore_tags",
- "string", "Comma separated list of tags to ignore; i.e. irc_join,irc_part,irc_quit", "", 0, 0,
- "", "", 0, "", "", "", "", "", "")
- colorize_config_option["greedy_matching"] = weechat.config_new_option(
- colorize_config_file, section_look, "greedy_matching",
- "boolean", "If off, then use lazy matching instead", "", 0,
- 0, "on", "on", 0, "", "", "", "", "", "")
- colorize_config_option["ignore_nicks_in_urls"] = weechat.config_new_option(
- colorize_config_file, section_look, "ignore_nicks_in_urls",
- "boolean", "If on, don't colorize nicks inside URLs", "", 0,
- 0, "off", "off", 0, "", "", "", "", "", "")
-
-def colorize_config_read():
- ''' Read configuration file. '''
- global colorize_config_file
- return weechat.config_read(colorize_config_file)
-
-def colorize_nick_color(nick, my_nick):
- ''' Retrieve nick color from weechat. '''
- if nick == my_nick:
- return w.color(w.config_string(w.config_get('weechat.color.chat_nick_self')))
- else:
- return w.info_get('irc_nick_color', nick)
-
-def colorize_cb(data, modifier, modifier_data, line):
- ''' Callback that does the colorizing, and returns new line if changed '''
-
- global ignore_nicks, ignore_channels, colored_nicks
-
-
- full_name = modifier_data.split(';')[1]
- channel = '.'.join(full_name.split('.')[1:])
-
- buffer = w.buffer_search('', full_name)
- # Check if buffer has colorized nicks
- if buffer not in colored_nicks:
- return line
-
- if channel and channel in ignore_channels:
- return line
-
- min_length = w.config_integer(colorize_config_option['min_nick_length'])
- reset = w.color('reset')
-
- # Don't colorize if the ignored tag is present in message
- tags_line = modifier_data.rsplit(';')
- if len(tags_line) >= 3:
- tags_line = tags_line[2].split(',')
- for i in w.config_string(colorize_config_option['ignore_tags']).split(','):
- if i in tags_line:
- return line
-
- for words in valid_nick_re.findall(line):
- nick = words[1]
- # Check that nick is not ignored and longer than minimum length
- if len(nick) < min_length or nick in ignore_nicks:
- continue
-
- # Check that nick is in the dictionary colored_nicks
- if nick in colored_nicks[buffer]:
- nick_color = colored_nicks[buffer][nick]
-
- # Let's use greedy matching. Will check against every word in a line.
- if w.config_boolean(colorize_config_option['greedy_matching']):
- for word in line.split():
- if w.config_boolean(colorize_config_option['ignore_nicks_in_urls']) and \
- word.startswith(('http://', 'https://')):
- continue
-
- if nick in word:
- # Is there a nick that contains nick and has a greater lenght?
- # If so let's save that nick into var biggest_nick
- biggest_nick = ""
- for i in colored_nicks[buffer]:
- if nick in i and nick != i and len(i) > len(nick):
- if i in word:
- # If a nick with greater len is found, and that word
- # also happens to be in word, then let's save this nick
- biggest_nick = i
- # If there's a nick with greater len, then let's skip this
- # As we will have the chance to colorize when biggest_nick
- # iterates being nick.
- if len(biggest_nick) > 0 and biggest_nick in word:
- pass
- elif len(word) < len(biggest_nick) or len(biggest_nick) == 0:
- new_word = word.replace(nick, '%s%s%s' % (nick_color, nick, reset))
- line = line.replace(word, new_word)
- # Let's use lazy matching for nick
- else:
- nick_color = colored_nicks[buffer][nick]
- # The two .? are in case somebody writes "nick:", "nick,", etc
- # to address somebody
- regex = r"(\A|\s).?(%s).?(\Z|\s)" % re.escape(nick)
- match = re.search(regex, line)
- if match is not None:
- new_line = line[:match.start(2)] + nick_color+nick+reset + line[match.end(2):]
- line = new_line
- return line
-
-def colorize_input_cb(data, modifier, modifier_data, line):
- ''' Callback that does the colorizing in input '''
-
- global ignore_nicks, ignore_channels, colored_nicks
-
- min_length = w.config_integer(colorize_config_option['min_nick_length'])
-
- if not w.config_boolean(colorize_config_option['colorize_input']):
- return line
-
- buffer = w.current_buffer()
- # Check if buffer has colorized nicks
- if buffer not in colored_nicks:
- return line
-
- channel = w.buffer_get_string(buffer, 'name')
- if channel and channel in ignore_channels:
- return line
-
- reset = w.color('reset')
-
- for words in valid_nick_re.findall(line):
- nick = words[1]
- # Check that nick is not ignored and longer than minimum length
- if len(nick) < min_length or nick in ignore_nicks:
- continue
- if nick in colored_nicks[buffer]:
- nick_color = colored_nicks[buffer][nick]
- line = line.replace(nick, '%s%s%s' % (nick_color, nick, reset))
-
- return line
-
-def populate_nicks(*args):
- ''' Fills entire dict with all nicks weechat can see and what color it has
- assigned to it. '''
- global colored_nicks
-
- colored_nicks = {}
-
- buffers = w.infolist_get('buffer', '', '')
- while w.infolist_next(buffers):
- buffer_ptr = w.infolist_pointer(buffers, 'pointer')
- my_nick = w.buffer_get_string(buffer_ptr, 'localvar_nick')
- nicklist = w.infolist_get('nicklist', buffer_ptr, '')
- while w.infolist_next(nicklist):
- if buffer_ptr not in colored_nicks:
- colored_nicks[buffer_ptr] = {}
-
- if w.infolist_string(nicklist, 'type') != 'nick':
- continue
-
- nick = w.infolist_string(nicklist, 'name')
- nick_color = colorize_nick_color(nick, my_nick)
-
- colored_nicks[buffer_ptr][nick] = nick_color
-
- w.infolist_free(nicklist)
-
- w.infolist_free(buffers)
-
- return w.WEECHAT_RC_OK
-
-def add_nick(data, signal, type_data):
- ''' Add nick to dict of colored nicks '''
- global colored_nicks
-
- # Nicks can have , in them in some protocols
- splitted = type_data.split(',')
- pointer = splitted[0]
- nick = ",".join(splitted[1:])
- if pointer not in colored_nicks:
- colored_nicks[pointer] = {}
-
- my_nick = w.buffer_get_string(pointer, 'localvar_nick')
- nick_color = colorize_nick_color(nick, my_nick)
-
- colored_nicks[pointer][nick] = nick_color
-
- return w.WEECHAT_RC_OK
-
-def remove_nick(data, signal, type_data):
- ''' Remove nick from dict with colored nicks '''
- global colored_nicks
-
- # Nicks can have , in them in some protocols
- splitted = type_data.split(',')
- pointer = splitted[0]
- nick = ",".join(splitted[1:])
-
- if pointer in colored_nicks and nick in colored_nicks[pointer]:
- del colored_nicks[pointer][nick]
-
- return w.WEECHAT_RC_OK
-
-def update_blacklist(*args):
- ''' Set the blacklist for channels and nicks. '''
- global ignore_channels, ignore_nicks
- ignore_channels = w.config_string(colorize_config_option['blacklist_channels']).split(',')
- ignore_nicks = w.config_string(colorize_config_option['blacklist_nicks']).split(',')
- return w.WEECHAT_RC_OK
-
-if __name__ == "__main__":
- if w.register(SCRIPT_NAME, SCRIPT_AUTHOR, SCRIPT_VERSION, SCRIPT_LICENSE,
- SCRIPT_DESC, "", ""):
- colorize_config_init()
- colorize_config_read()
-
- # Run once to get data ready
- update_blacklist()
- populate_nicks()
-
- w.hook_signal('nicklist_nick_added', 'add_nick', '')
- w.hook_signal('nicklist_nick_removed', 'remove_nick', '')
- w.hook_modifier('weechat_print', 'colorize_cb', '')
- # Hook config for changing colors
- w.hook_config('weechat.color.chat_nick_colors', 'populate_nicks', '')
- w.hook_config('weechat.look.nick_color_hash', 'populate_nicks', '')
- # Hook for working togheter with other scripts (like colorize_lines)
- w.hook_modifier('colorize_nicks', 'colorize_cb', '')
- # Hook for modifying input
- w.hook_modifier('250|input_text_display', 'colorize_input_cb', '')
- # Hook for updating blacklist (this could be improved to use fnmatch)
- weechat.hook_config('%s.look.blacklist*' % SCRIPT_NAME, 'update_blacklist', '')
diff --git a/.weechat/python/go.py b/.weechat/python/go.py
deleted file mode 100644
index a30f58f0..00000000
--- a/.weechat/python/go.py
+++ /dev/null
@@ -1,561 +0,0 @@
-# -*- coding: utf-8 -*-
-#
-# Copyright (C) 2009-2014 Sébastien Helleu <flashcode@flashtux.org>
-# Copyright (C) 2010 m4v <lambdae2@gmail.com>
-# Copyright (C) 2011 stfn <stfnmd@googlemail.com>
-#
-# This program is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 3 of the License, or
-# (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program. If not, see <http://www.gnu.org/licenses/>.
-#
-
-#
-# History:
-#
-# 2017-04-01, Sébastien Helleu <flashcode@flashtux.org>:
-# version 2.5: add option "buffer_number"
-# 2017-03-02, Sébastien Helleu <flashcode@flashtux.org>:
-# version 2.4: fix syntax and indentation error
-# 2017-02-25, Simmo Saan <simmo.saan@gmail.com>
-# version 2.3: fix fuzzy search breaking buffer number search display
-# 2016-01-28, ylambda <ylambda@koalabeast.com>
-# version 2.2: add option "fuzzy_search"
-# 2015-11-12, nils_2 <weechatter@arcor.de>
-# version 2.1: fix problem with buffer short_name "weechat", using option
-# "use_core_instead_weechat", see:
-# https://github.com/weechat/weechat/issues/574
-# 2014-05-12, Sébastien Helleu <flashcode@flashtux.org>:
-# version 2.0: add help on options, replace option "sort_by_activity" by
-# "sort" (add sort by name and first match at beginning of
-# name and by number), PEP8 compliance
-# 2012-11-26, Nei <anti.teamidiot.de>
-# version 1.9: add auto_jump option to automatically go to buffer when it
-# is uniquely selected
-# 2012-09-17, Sébastien Helleu <flashcode@flashtux.org>:
-# version 1.8: fix jump to non-active merged buffers (jump with buffer name
-# instead of number)
-# 2012-01-03 nils_2 <weechatter@arcor.de>
-# version 1.7: add option "use_core_instead_weechat"
-# 2012-01-03, Sébastien Helleu <flashcode@flashtux.org>:
-# version 1.6: make script compatible with Python 3.x
-# 2011-08-24, stfn <stfnmd@googlemail.com>:
-# version 1.5: /go with name argument jumps directly to buffer
-# Remember cursor position in buffer input
-# 2011-05-31, Elián Hanisch <lambdae2@gmail.com>:
-# version 1.4: Sort list of buffers by activity.
-# 2011-04-25, Sébastien Helleu <flashcode@flashtux.org>:
-# version 1.3: add info "go_running" (used by script input_lock.rb)
-# 2010-11-01, Sébastien Helleu <flashcode@flashtux.org>:
-# version 1.2: use high priority for hooks to prevent conflict with other
-# plugins/scripts (WeeChat >= 0.3.4 only)
-# 2010-03-25, Elián Hanisch <lambdae2@gmail.com>:
-# version 1.1: use a space to match the end of a string
-# 2009-11-16, Sébastien Helleu <flashcode@flashtux.org>:
-# version 1.0: add new option to display short names
-# 2009-06-15, Sébastien Helleu <flashcode@flashtux.org>:
-# version 0.9: fix typo in /help go with command /key
-# 2009-05-16, Sébastien Helleu <flashcode@flashtux.org>:
-# version 0.8: search buffer by number, fix bug when window is split
-# 2009-05-03, Sébastien Helleu <flashcode@flashtux.org>:
-# version 0.7: eat tab key (do not complete input, just move buffer
-# pointer)
-# 2009-05-02, Sébastien Helleu <flashcode@flashtux.org>:
-# version 0.6: sync with last API changes
-# 2009-03-22, Sébastien Helleu <flashcode@flashtux.org>:
-# version 0.5: update modifier signal name for input text display,
-# fix arguments for function string_remove_color
-# 2009-02-18, Sébastien Helleu <flashcode@flashtux.org>:
-# version 0.4: do not hook command and init options if register failed
-# 2009-02-08, Sébastien Helleu <flashcode@flashtux.org>:
-# version 0.3: case insensitive search for buffers names
-# 2009-02-08, Sébastien Helleu <flashcode@flashtux.org>:
-# version 0.2: add help about Tab key
-# 2009-02-08, Sébastien Helleu <flashcode@flashtux.org>:
-# version 0.1: initial release
-#
-
-"""
-Quick jump to buffers.
-(this script requires WeeChat 0.3.0 or newer)
-"""
-
-from __future__ import print_function
-
-SCRIPT_NAME = 'go'
-SCRIPT_AUTHOR = 'Sébastien Helleu <flashcode@flashtux.org>'
-SCRIPT_VERSION = '2.5'
-SCRIPT_LICENSE = 'GPL3'
-SCRIPT_DESC = 'Quick jump to buffers'
-
-SCRIPT_COMMAND = 'go'
-
-IMPORT_OK = True
-
-try:
- import weechat
-except ImportError:
- print('This script must be run under WeeChat.')
- print('Get WeeChat now at: http://www.weechat.org/')
- IMPORT_OK = False
-
-import re
-
-# script options
-SETTINGS = {
- 'color_number': (
- 'yellow,magenta',
- 'color for buffer number (not selected)'),
- 'color_number_selected': (
- 'yellow,red',
- 'color for selected buffer number'),
- 'color_name': (
- 'black,cyan',
- 'color for buffer name (not selected)'),
- 'color_name_selected': (
- 'black,brown',
- 'color for a selected buffer name'),
- 'color_name_highlight': (
- 'red,cyan',
- 'color for highlight in buffer name (not selected)'),
- 'color_name_highlight_selected': (
- 'red,brown',
- 'color for highlight in a selected buffer name'),
- 'message': (
- 'Go to: ',
- 'message to display before list of buffers'),
- 'short_name': (
- 'off',
- 'display and search in short names instead of buffer name'),
- 'sort': (
- 'number,beginning',
- 'comma-separated list of keys to sort buffers '
- '(the order is important, sorts are performed in the given order): '
- 'name = sort by name (or short name), ',
- 'hotlist = sort by hotlist order, '
- 'number = first match a buffer number before digits in name, '
- 'beginning = first match at beginning of names (or short names); '
- 'the default sort of buffers is by numbers'),
- 'use_core_instead_weechat': (
- 'off',
- 'use name "core" instead of "weechat" for core buffer'),
- 'auto_jump': (
- 'off',
- 'automatically jump to buffer when it is uniquely selected'),
- 'fuzzy_search': (
- 'off',
- 'search buffer matches using approximation'),
- 'buffer_number': (
- 'on',
- 'display buffer number'),
-}
-
-# hooks management
-HOOK_COMMAND_RUN = {
- 'input': ('/input *', 'go_command_run_input'),
- 'buffer': ('/buffer *', 'go_command_run_buffer'),
- 'window': ('/window *', 'go_command_run_window'),
-}
-hooks = {}
-
-# input before command /go (we'll restore it later)
-saved_input = ''
-saved_input_pos = 0
-
-# last user input (if changed, we'll update list of matching buffers)
-old_input = None
-
-# matching buffers
-buffers = []
-buffers_pos = 0
-
-
-def go_option_enabled(option):
- """Checks if a boolean script option is enabled or not."""
- return weechat.config_string_to_boolean(weechat.config_get_plugin(option))
-
-
-def go_info_running(data, info_name, arguments):
- """Returns "1" if go is running, otherwise "0"."""
- return '1' if 'modifier' in hooks else '0'
-
-
-def go_unhook_one(hook):
- """Unhook something hooked by this script."""
- global hooks
- if hook in hooks:
- weechat.unhook(hooks[hook])
- del hooks[hook]
-
-
-def go_unhook_all():
- """Unhook all."""
- go_unhook_one('modifier')
- for hook in HOOK_COMMAND_RUN:
- go_unhook_one(hook)
-
-
-def go_hook_all():
- """Hook command_run and modifier."""
- global hooks
- priority = ''
- version = weechat.info_get('version_number', '') or 0
- # use high priority for hook to prevent conflict with other plugins/scripts
- # (WeeChat >= 0.3.4 only)
- if int(version) >= 0x00030400:
- priority = '2000|'
- for hook, value in HOOK_COMMAND_RUN.items():
- if hook not in hooks:
- hooks[hook] = weechat.hook_command_run(
- '%s%s' % (priority, value[0]),
- value[1], '')
- if 'modifier' not in hooks:
- hooks['modifier'] = weechat.hook_modifier(
- 'input_text_display_with_cursor', 'go_input_modifier', '')
-
-
-def go_start(buf):
- """Start go on buffer."""
- global saved_input, saved_input_pos, old_input, buffers_pos
- go_hook_all()
- saved_input = weechat.buffer_get_string(buf, 'input')
- saved_input_pos = weechat.buffer_get_integer(buf, 'input_pos')
- weechat.buffer_set(buf, 'input', '')
- old_input = None
- buffers_pos = 0
-
-
-def go_end(buf):
- """End go on buffer."""
- global saved_input, saved_input_pos, old_input
- go_unhook_all()
- weechat.buffer_set(buf, 'input', saved_input)
- weechat.buffer_set(buf, 'input_pos', str(saved_input_pos))
- old_input = None
-
-
-def go_match_beginning(buf, string):
- """Check if a string matches the beginning of buffer name/short name."""
- if not string:
- return False
- esc_str = re.escape(string)
- if re.search(r'^#?' + esc_str, buf['name']) \
- or re.search(r'^#?' + esc_str, buf['short_name']):
- return True
- return False
-
-
-def go_match_fuzzy(name, string):
- """Check if string matches name using approximation."""
- if not string:
- return False
-
- name_len = len(name)
- string_len = len(string)
-
- if string_len > name_len:
- return False
- if name_len == string_len:
- return name == string
-
- # Attempt to match all chars somewhere in name
- prev_index = -1
- for i, char in enumerate(string):
- index = name.find(char, prev_index+1)
- if index == -1:
- return False
- prev_index = index
- return True
-
-
-def go_now(buf, args):
- """Go to buffer specified by args."""
- listbuf = go_matching_buffers(args)
- if not listbuf:
- return
-
- # prefer buffer that matches at beginning (if option is enabled)
- if 'beginning' in weechat.config_get_plugin('sort').split(','):
- for index in range(len(listbuf)):
- if go_match_beginning(listbuf[index], args):
- weechat.command(buf,
- '/buffer ' + str(listbuf[index]['full_name']))
- return
-
- # jump to first buffer in matching buffers by default
- weechat.command(buf, '/buffer ' + str(listbuf[0]['full_name']))
-
-
-def go_cmd(data, buf, args):
- """Command "/go": just hook what we need."""
- global hooks
- if args:
- go_now(buf, args)
- elif 'modifier' in hooks:
- go_end(buf)
- else:
- go_start(buf)
- return weechat.WEECHAT_RC_OK
-
-
-def go_matching_buffers(strinput):
- """Return a list with buffers matching user input."""
- global buffers_pos
- listbuf = []
- if len(strinput) == 0:
- buffers_pos = 0
- strinput = strinput.lower()
- infolist = weechat.infolist_get('buffer', '', '')
- while weechat.infolist_next(infolist):
- short_name = weechat.infolist_string(infolist, 'short_name')
- if go_option_enabled('short_name'):
- name = weechat.infolist_string(infolist, 'short_name')
- else:
- name = weechat.infolist_string(infolist, 'name')
- if name == 'weechat' \
- and go_option_enabled('use_core_instead_weechat') \
- and weechat.infolist_string(infolist, 'plugin_name') == 'core':
- name = 'core'
- number = weechat.infolist_integer(infolist, 'number')
- full_name = weechat.infolist_string(infolist, 'full_name')
- if not full_name:
- full_name = '%s.%s' % (
- weechat.infolist_string(infolist, 'plugin_name'),
- weechat.infolist_string(infolist, 'name'))
- pointer = weechat.infolist_pointer(infolist, 'pointer')
- matching = name.lower().find(strinput) >= 0
- if not matching and strinput[-1] == ' ':
- matching = name.lower().endswith(strinput.strip())
- if not matching and go_option_enabled('fuzzy_search'):
- matching = go_match_fuzzy(name.lower(), strinput)
- if not matching and strinput.isdigit():
- matching = str(number).startswith(strinput)
- if len(strinput) == 0 or matching:
- listbuf.append({
- 'number': number,
- 'short_name': short_name,
- 'name': name,
- 'full_name': full_name,
- 'pointer': pointer,
- })
- weechat.infolist_free(infolist)
-
- # sort buffers
- hotlist = []
- infolist = weechat.infolist_get('hotlist', '', '')
- while weechat.infolist_next(infolist):
- hotlist.append(
- weechat.infolist_pointer(infolist, 'buffer_pointer'))
- weechat.infolist_free(infolist)
- last_index_hotlist = len(hotlist)
-
- def _sort_name(buf):
- """Sort buffers by name (or short name)."""
- return buf['name']
-
- def _sort_hotlist(buf):
- """Sort buffers by hotlist order."""
- try:
- return hotlist.index(buf['pointer'])
- except ValueError:
- # not in hotlist, always last.
- return last_index_hotlist
-
- def _sort_match_number(buf):
- """Sort buffers by match on number."""
- return 0 if str(buf['number']) == strinput else 1
-
- def _sort_match_beginning(buf):
- """Sort buffers by match at beginning."""
- return 0 if go_match_beginning(buf, strinput) else 1
-
- funcs = {
- 'name': _sort_name,
- 'hotlist': _sort_hotlist,
- 'number': _sort_match_number,
- 'beginning': _sort_match_beginning,
- }
-
- for key in weechat.config_get_plugin('sort').split(','):
- if key in funcs:
- listbuf = sorted(listbuf, key=funcs[key])
-
- if not strinput:
- index = [i for i, buf in enumerate(listbuf)
- if buf['pointer'] == weechat.current_buffer()]
- if index:
- buffers_pos = index[0]
-
- return listbuf
-
-
-def go_buffers_to_string(listbuf, pos, strinput):
- """Return string built with list of buffers found (matching user input)."""
- string = ''
- strinput = strinput.lower()
- for i in range(len(listbuf)):
- selected = '_selected' if i == pos else ''
- buffer_name = listbuf[i]['name']
- index = buffer_name.lower().find(strinput)
- if index >= 0:
- index2 = index + len(strinput)
- name = '%s%s%s%s%s' % (
- buffer_name[:index],
- weechat.color(weechat.config_get_plugin(
- 'color_name_highlight' + selected)),
- buffer_name[index:index2],
- weechat.color(weechat.config_get_plugin(
- 'color_name' + selected)),
- buffer_name[index2:])
- elif go_option_enabled("fuzzy_search") and \
- go_match_fuzzy(buffer_name.lower(), strinput):
- name = ""
- prev_index = -1
- for char in strinput.lower():
- index = buffer_name.lower().find(char, prev_index+1)
- if prev_index < 0:
- name += buffer_name[:index]
- name += weechat.color(weechat.config_get_plugin(
- 'color_name_highlight' + selected))
- if prev_index >= 0 and index > prev_index+1:
- name += weechat.color(weechat.config_get_plugin(
- 'color_name' + selected))
- name += buffer_name[prev_index+1:index]
- name += weechat.color(weechat.config_get_plugin(
- 'color_name_highlight' + selected))
- name += buffer_name[index]
- prev_index = index
-
- name += weechat.color(weechat.config_get_plugin(
- 'color_name' + selected))
- name += buffer_name[prev_index+1:]
- else:
- name = buffer_name
- string += ' '
- if go_option_enabled('buffer_number'):
- string += '%s%s' % (
- weechat.color(weechat.config_get_plugin(
- 'color_number' + selected)),
- str(listbuf[i]['number']))
- string += '%s%s%s' % (
- weechat.color(weechat.config_get_plugin(
- 'color_name' + selected)),
- name,
- weechat.color('reset'))
- return ' ' + string if string else ''
-
-
-def go_input_modifier(data, modifier, modifier_data, string):
- """This modifier is called when input text item is built by WeeChat.
-
- This is commonly called after changes in input or cursor move: it builds
- a new input with prefix ("Go to:"), and suffix (list of buffers found).
- """
- global old_input, buffers, buffers_pos
- if modifier_data != weechat.current_buffer():
- return ''
- names = ''
- new_input = weechat.string_remove_color(string, '')
- new_input = new_input.lstrip()
- if old_input is None or new_input != old_input:
- old_buffers = buffers
- buffers = go_matching_buffers(new_input)
- if buffers != old_buffers and len(new_input) > 0:
- if len(buffers) == 1 and go_option_enabled('auto_jump'):
- weechat.command(modifier_data, '/wait 1ms /input return')
- buffers_pos = 0
- old_input = new_input
- names = go_buffers_to_string(buffers, buffers_pos, new_input.strip())
- return weechat.config_get_plugin('message') + string + names
-
-
-def go_command_run_input(data, buf, command):
- """Function called when a command "/input xxx" is run."""
- global buffers, buffers_pos
- if command == '/input search_text' or command.find('/input jump') == 0:
- # search text or jump to another buffer is forbidden now
- return weechat.WEECHAT_RC_OK_EAT
- elif command == '/input complete_next':
- # choose next buffer in list
- buffers_pos += 1
- if buffers_pos >= len(buffers):
- buffers_pos = 0
- weechat.hook_signal_send('input_text_changed',
- weechat.WEECHAT_HOOK_SIGNAL_STRING, '')
- return weechat.WEECHAT_RC_OK_EAT
- elif command == '/input complete_previous':
- # choose previous buffer in list
- buffers_pos -= 1
- if buffers_pos < 0:
- buffers_pos = len(buffers) - 1
- weechat.hook_signal_send('input_text_changed',
- weechat.WEECHAT_HOOK_SIGNAL_STRING, '')
- return weechat.WEECHAT_RC_OK_EAT
- elif command == '/input return':
- # switch to selected buffer (if any)
- go_end(buf)
- if len(buffers) > 0:
- weechat.command(
- buf, '/buffer ' + str(buffers[buffers_pos]['full_name']))
- return weechat.WEECHAT_RC_OK_EAT
- return weechat.WEECHAT_RC_OK
-
-
-def go_command_run_buffer(data, buf, command):
- """Function called when a command "/buffer xxx" is run."""
- return weechat.WEECHAT_RC_OK_EAT
-
-
-def go_command_run_window(data, buf, command):
- """Function called when a command "/window xxx" is run."""
- return weechat.WEECHAT_RC_OK_EAT
-
-
-def go_unload_script():
- """Function called when script is unloaded."""
- go_unhook_all()
- return weechat.WEECHAT_RC_OK
-
-
-def go_main():
- """Entry point."""
- if not weechat.register(SCRIPT_NAME, SCRIPT_AUTHOR, SCRIPT_VERSION,
- SCRIPT_LICENSE, SCRIPT_DESC,
- 'go_unload_script', ''):
- return
- weechat.hook_command(
- SCRIPT_COMMAND,
- 'Quick jump to buffers', '[name]',
- 'name: directly jump to buffer by name (without argument, list is '
- 'displayed)\n\n'
- 'You can bind command to a key, for example:\n'
- ' /key bind meta-g /go\n\n'
- 'You can use completion key (commonly Tab and shift-Tab) to select '
- 'next/previous buffer in list.',
- '%(buffers_names)',
- 'go_cmd', '')
-
- # set default settings
- version = weechat.info_get('version_number', '') or 0
- for option, value in SETTINGS.items():
- if not weechat.config_is_set_plugin(option):
- weechat.config_set_plugin(option, value[0])
- if int(version) >= 0x00030500:
- weechat.config_set_desc_plugin(
- option, '%s (default: "%s")' % (value[1], value[0]))
- weechat.hook_info('go_running',
- 'Return "1" if go is running, otherwise "0"',
- '',
- 'go_info_running', '')
-
-
-if __name__ == "__main__" and IMPORT_OK:
- go_main()
diff --git a/.weechat/python/urlserver.py b/.weechat/python/urlserver.py
deleted file mode 100644
index f54211ef..00000000
--- a/.weechat/python/urlserver.py
+++ /dev/null
@@ -1,1148 +0,0 @@
-# -*- coding: utf-8 -*-
-#
-# Copyright (C) 2011-2015 Sébastien Helleu <flashcode@flashtux.org>
-# Copyright (C) 2011 xt <xt@bash.no>
-# Copyright (C) 2012 Filip H.F. "FiXato" Slagter
-# <fixato+weechat+urlserver@gmail.com>
-# Copyright (C) 2012 WillyKaze <willykaze@willykaze.org>
-# Copyright (C) 2013 Thomas Kindler <mail_weechat@t-kindler.de>
-# Copyright (C) 2013 Felix Eckhofer <felix@tribut.de>
-#
-# This program is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 3 of the License, or
-# (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program. If not, see <http://www.gnu.org/licenses/>.
-#
-
-#
-# Shorten URLs with own HTTP server.
-# (this script requires Python >= 2.6)
-#
-# How does it work?
-#
-# 1. The URLs displayed in buffers are shortened and stored in memory (saved in
-# a file when script is unloaded).
-# 2. URLs shortened can be displayed below messages, in a dedicated buffer, or
-# as HTML page in your browser.
-# 3. This script embeds an HTTP server, which will redirect shortened URLs
-# to real URL and display list of all URLs if you browse address without
-# URL key.
-# 4. It is recommended to customize/protect the HTTP server using script
-# options (see /help urlserver).
-#
-# List of URLs:
-# - in WeeChat: /urlserver
-# - in browser: http://myhost.org:1234/
-#
-# History:
-#
-# 2017-07-26, Sébastien Helleu <flashcode@flashtux.org>:
-# v2.2: fix write on socket with python 3.x
-# 2016-11-01, Sébastien Helleu <flashcode@flashtux.org>:
-# v2.1: add option "msg_filtered"
-# 2016-01-20, Yves Stadler <yves.stadler@gmail.com>:
-# v2.0: add option "http_open_in_new_page"
-# 2015-05-16, Sébastien Helleu <flashcode@flashtux.org>:
-# v1.9: add option "http_auth_redirect", fix flake8 warnings
-# 2015-04-14, Sébastien Helleu <flashcode@flashtux.org>:
-# v1.8: evaluate option "http_auth" (to use secured data)
-# 2013-12-09, WakiMiko
-# v1.7: use HTTPS for youtube embedding
-# 2013-12-09, Sébastien Helleu <flashcode@flashtux.org>:
-# v1.6: add reason phrase after HTTP code 302 and empty line at the end
-# 2013-12-05, Sébastien Helleu <flashcode@flashtux.org>:
-# v1.5: replace HTTP 301 by 302
-# 2013-12-05, Sébastien Helleu <flashcode@flashtux.org>:
-# v1.4: use HTTP 301 instead of meta for the redirection when
-# there is no referer in request
-# 2013-11-29, Felix Eckhofer <felix@tribut.de>
-# v1.3: - make it possible to run reverse proxy in a subdirectory by
-# generating relative links and using the <base> tag. to use this,
-# set http_hostname_display to 'domain.tld/subdir'.
-# - mention favicon explicitly (now works in subdirectories, too).
-# - update favicon to new weechat logo.
-# - set meta referrer to never in redirect page, so chrome users'
-# referrers are hidden, too
-# - fix http_auth in chrome and other browsers which send header
-# names in lower case
-# 2013-05-04, Thomas Kindler <mail_weechat@t-kindler.de>
-# v1.2: added a "http_scheme_display" option. This makes it possible to run
-# the server behind a reverse proxy with https:// URLs.
-# 2013-03-25, Hermit (@irc.freenode.net):
-# v1.1: made links relative in the html, so that they can be followed when
-# accessing the listing remotely using the weechat box's IP directly.
-# 2012-12-12, WillyKaze <willykaze@willykaze.org>:
-# v1.0: add options "http_time_format", "display_msg_in_url" (works with
-# relay/irc), "color_in_msg", "separators"
-# 2012-04-18, Filip H.F. "FiXato" Slagter <fixato+weechat+urlserver@gmail.com>:
-# v0.9: add options "http_autostart", "http_port_display"
-# "url_min_length" can now be set to -1 to auto-detect minimal url
-# length; also, if port is 80 now, :80 will no longer be added to the
-# shortened url.
-# 2012-04-17, Filip H.F. "FiXato" Slagter <fixato+weechat+urlserver@gmail.com>:
-# v0.8: add more CSS support by adding options "http_fg_color",
-# "http_css_url" and "http_title", add descriptive classes to most
-# html elements.
-# 2012-04-11, Sébastien Helleu <flashcode@flashtux.org>:
-# v0.7: fix truncated HTML page (thanks to xt), fix base64 decoding with
-# Python 3.x
-# 2012-01-19, Sébastien Helleu <flashcode@flashtux.org>:
-# v0.6: add option "http_hostname_display"
-# 2012-01-03, Sébastien Helleu <flashcode@flashtux.org>:
-# v0.5: make script compatible with Python 3.x
-# 2011-10-31, Sébastien Helleu <flashcode@flashtux.org>:
-# v0.4: add options "http_embed_youtube_size" and "http_bg_color",
-# add extensions jpeg/bmp/svg for embedded images
-# 2011-10-30, Sébastien Helleu <flashcode@flashtux.org>:
-# v0.3: escape HTML chars for page with list of URLs, add option
-# "http_prefix_suffix", disable highlights on urlserver buffer
-# 2011-10-30, Sébastien Helleu <flashcode@flashtux.org>:
-# v0.2: fix error on loading of file "urlserver_list.txt" when it is empty
-# 2011-10-30, Sébastien Helleu <flashcode@flashtux.org>:
-# v0.1: initial release
-#
-
-SCRIPT_NAME = 'urlserver'
-SCRIPT_AUTHOR = 'Sébastien Helleu <flashcode@flashtux.org>'
-SCRIPT_VERSION = '2.2'
-SCRIPT_LICENSE = 'GPL3'
-SCRIPT_DESC = 'Shorten URLs with own HTTP server'
-
-SCRIPT_COMMAND = 'urlserver'
-SCRIPT_BUFFER = 'urlserver'
-
-import_ok = True
-
-try:
- import weechat
-except ImportError:
- print('This script must be run under WeeChat.')
- print('Get WeeChat now at: http://www.weechat.org/')
- import_ok = False
-
-try:
- import ast
- import base64
- import cgi
- import datetime
- import os
- import re
- import socket
- import string
- import sys
-except ImportError as message:
- print('Missing package(s) for %s: %s' % (SCRIPT_NAME, message))
- import_ok = False
-
-# regex are from urlbar.py, written by xt
-url_octet = r'(?:2(?:[0-4]\d|5[0-5])|1\d\d|\d{1,2})'
-url_ipaddr = r'%s(?:\.%s){3}' % (url_octet, url_octet)
-url_label = r'[0-9a-z][-0-9a-z]*[0-9a-z]?'
-url_domain = r'%s(?:\.%s)*\.[a-z][-0-9a-z]*[a-z]?' % (url_label, url_label)
-
-urlserver = {
- 'socket': None,
- 'hook_fd': None,
- 'regex': re.compile(r'(\w+://(?:%s|%s)(?::\d+)?(?:/[^\])>\s]*)?)' %
- (url_domain, url_ipaddr),
- re.IGNORECASE),
- 'urls': {},
- 'number': 0,
- 'buffer': '',
-}
-
-# script options
-urlserver_settings_default = {
- # HTTP server settings
- 'http_autostart': (
- 'on',
- 'start the built-in HTTP server automatically)'),
- 'http_scheme_display': (
- 'http',
- 'display this scheme in shortened URLs'),
- 'http_hostname': (
- '',
- 'force hostname/IP in bind of socket '
- '(empty value = auto-detect current hostname)'),
- 'http_hostname_display': (
- '',
- 'display this hostname in shortened URLs'),
- 'http_port': (
- '',
- 'force port for listening (empty value = find a random free port)'),
- 'http_port_display': (
- '',
- 'display this port in shortened URLs. Useful if you forward '
- 'a different external port to the internal port'),
- 'http_allowed_ips': (
- '',
- 'regex for IPs allowed to use server '
- '(example: "^(123.45.67.89|192.160.*)$")'),
- 'http_auth': (
- '',
- 'login and password (format: "login:password") required to access to '
- 'page with list of URLs (note: content is evaluated, see /help eval)'),
- 'http_auth_redirect': (
- 'on',
- 'require the login/password (if option "http_auth" is set) for URLs '
- 'redirections'),
- 'http_url_prefix': (
- '',
- 'prefix to add in URLs to prevent external people to scan your URLs '
- '(for example: prefix "xx" will give URL: http://host.com:1234/xx/8)'),
- 'http_bg_color': (
- '#f4f4f4',
- 'background color for HTML page'),
- 'http_fg_color': (
- '#000',
- 'foreground color for HTML page'),
- 'http_css_url': (
- '',
- 'URL of external Cascading Style Sheet to add (BE CAREFUL: the HTTP '
- 'referer will be sent to site hosting CSS file!) (empty value = use '
- 'default embedded CSS)'),
- 'http_embed_image': (
- 'off',
- 'embed images in HTML page (BE CAREFUL: the HTTP referer will be sent '
- 'to site hosting image!)'),
- 'http_embed_youtube': (
- 'off',
- 'embed youtube videos in HTML page (BE CAREFUL: the HTTP referer '
- 'will be sent to youtube!)'),
- 'http_embed_youtube_size': (
- '480*350',
- 'size for embedded youtube video, format is "xxx*yyy"'),
- 'http_prefix_suffix': (
- ' ',
- 'suffix displayed between prefix and message in HTML page'),
- 'http_title': (
- 'WeeChat URLs',
- 'title of the HTML page'),
- 'http_time_format': (
- '%d/%m/%y %H:%M:%S',
- 'time format in the HTML page'),
- 'http_open_in_new_page': (
- 'on',
- 'open links in new pages/tabs'),
- # message filter settings
- 'msg_ignore_buffers': (
- 'core.weechat,python.grep',
- 'comma-separated list (without spaces) of buffers to ignore '
- '(full name like "irc.freenode.#weechat")'),
- 'msg_ignore_tags': (
- 'irc_quit,irc_part,notify_none',
- 'comma-separated list (without spaces) of tags (or beginning of tags) '
- 'to ignore (for example, use "notify_none" to ignore self messages or '
- '"nick_weebot" to ignore messages from nick "weebot")'),
- 'msg_require_tags': (
- 'nick_',
- 'comma-separated list (without spaces) of tags (or beginning of tags) '
- 'required to shorten URLs (for example "nick_" to shorten URLs only '
- 'in messages from other users)'),
- 'msg_ignore_regex': (
- '',
- 'ignore messages matching this regex'),
- 'msg_ignore_dup_urls': (
- 'off',
- 'ignore duplicated URLs (do not add an URL in list if it is already)'),
- 'msg_filtered': (
- 'off',
- 'shorten URLs in filtered messages (with /filter)'),
- # display settings
- 'color': (
- 'darkgray',
- 'color for urls displayed after message'),
- 'color_in_msg': (
- '',
- 'color for urls displayed inside irc message: it is a number '
- '(irc color) between 00 and 15 (see doc for a list of irc colors)'),
- 'separators': (
- '[|]',
- 'separators for short url list (string with exactly 3 chars)'),
- 'display_urls': (
- 'on',
- 'display URLs below messages'),
- 'display_urls_in_msg': (
- 'off',
- 'add shorten url next to the original url (only in IRC messages) '
- '(useful for urlserver behind relay/irc)'),
- 'url_min_length': (
- '0',
- 'minimum length for an URL to be shortened (0 = shorten all URLs, '
- '-1 = detect length based on shorten URL)'),
- 'urls_amount': (
- '100',
- 'number of URLs to keep in memory (and in file when script is not '
- 'loaded)'),
- 'buffer_short_name': (
- 'off',
- 'use buffer short name on dedicated buffer'),
- 'debug': (
- 'off',
- 'print some debug messages'),
-}
-urlserver_settings = {}
-
-
-def base62_encode(number):
- """Encode a number in base62 (all digits + a-z + A-Z)."""
- base62chars = string.digits + string.ascii_letters
- l = []
- while number > 0:
- remainder = number % 62
- number = number // 62
- l.insert(0, base62chars[remainder])
- return ''.join(l) or '0'
-
-
-def base62_decode(str_value):
- """Decode a base62 string (all digits + a-z + A-Z) to a number."""
- base62chars = string.digits + string.ascii_letters
- return sum([base62chars.index(char) * (62 ** (len(str_value) - index - 1))
- for index, char in enumerate(str_value)])
-
-
-def base64_decode(s):
- if sys.version_info >= (3,):
- # python 3.x
- return base64.b64decode(s.encode('utf-8'))
- else:
- # python 2.x
- return base64.b64decode(s)
-
-
-def urlserver_get_base_url():
- """
- Return url with port number if != default port for the protocol,
- including prefix path.
- """
- global urlserver_settings
-
- scheme = urlserver_settings['http_scheme_display']
- hostname = (urlserver_settings['http_hostname_display'] or
- urlserver_settings['http_hostname'] or socket.getfqdn())
-
- # If the built-in HTTP server isn't running, default to port from settings
- port = urlserver_settings['http_port']
- if len(urlserver_settings['http_port_display']) > 0:
- port = urlserver_settings['http_port_display']
- elif urlserver['socket']:
- port = urlserver['socket'].getsockname()[1]
-
- # Don't add :port if the port matches the default port for the protocol
- prefixed_port = ':%s' % port
-
- if scheme == "http" and prefixed_port == ':80':
- prefixed_port = ''
- elif scheme == "https" and prefixed_port == ':443':
- prefixed_port = ''
-
- prefix = ''
- if urlserver_settings['http_url_prefix']:
- prefix = '%s/' % urlserver_settings['http_url_prefix']
-
- return '%s://%s%s/%s' % (scheme, hostname, prefixed_port, prefix)
-
-
-def urlserver_short_url(number, full=True):
- """Return short URL with number."""
- return '%s%s' % (urlserver_get_base_url() if full else '',
- base62_encode(number))
-
-
-def urlserver_server_reply(conn, code, extra_header, message,
- mimetype='text/html'):
- """Send a HTTP reply to client."""
- global urlserver_settings
- if extra_header:
- extra_header += '\r\n'
- s = 'HTTP/1.1 %s\r\n' \
- '%s' \
- 'Content-Type: %s\r\n' \
- 'Content-Length: %d\r\n' \
- '\r\n' \
- % (code, extra_header, mimetype, len(message))
- msg = None
- if sys.version_info >= (3,):
- # python 3.x
- if type(message) is bytes:
- msg = s.encode('utf-8') + message
- else:
- msg = s.encode('utf-8') + message.encode('utf-8')
- else:
- # python 2.x
- msg = s + message
- if urlserver_settings['debug'] == 'on':
- weechat.prnt('', 'urlserver: sending %d bytes' % len(msg))
- conn.sendall(msg)
-
-
-def urlserver_server_reply_auth_required(conn):
- """Reply a 401 (authorization required)."""
- urlserver_server_reply(conn,
- '401 Authorization required',
- 'WWW-Authenticate: Basic realm="%s"' % SCRIPT_NAME,
- '')
-
-
-def urlserver_server_favicon():
- """Return favicon for HTML page."""
- s = ('iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABmJLR0QA/wD/AP+g'
- 'vaeTAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH3QUTDCsWY4ZjDAAAAC5p'
- 'VFh0Q29tbWVudAAAAAAAQnkgRmxhc2hDb2RlIC0gaHR0cDovL3dlZWNoYXQub3Jn'
- 'L3IAZSEAAAZJSURBVFjD7ZZdbFTHFcf/M/fueteLP8A2/oSExsVASECCIIgctaIG'
- 'oURVmzyEipJWSYUsFRGliJS3qEkElVqpapWHSrxEqVopbaVGrRKJtiRYlps6ttMH'
- 'YmwIKcaO7cXE3vXdj/s1M+f04e6u1vVWfaxUMVejO/fO3HN+5z/nzgxwv9wv/+Mi'
- '/lPHxq3NyM6tlh9jR14/3BBvqqsPApXwC2FMhdoOfRVTobZVoONambhIWgm2kSBb'
- 'JEgiYQQljOCEBie14IQB1Wk2CcWc1NrkeMJ53a7l/Ge513C28RUAwJMXjz7X0rvp'
- '64iL3UZwtwE3GCKhmKDBMEzQTFBM0MZAkUFoTNQuV4ruoSGw0SAi0Gf522Yy/8ua'
- 'AGcbX0HnrvYtT7068KdUZ8MeRUboslEiKDKAiSoTIAxDcCSngICEKF2otMrPEgKC'
- 'mJEORuHohZoAOwd6O77y/ccvN3Y37Aq1gRSAEACEgJRlBxJSMKQBJDiqzBBEADOE'
- 'YUAzQxFBE7M2kUTakPB1wNP59wH4NQEOfXvfWy1bN+5SWlfYpRCwbIniF66Xnly6'
- 'ExTDTBgoX4Xa1b52w0AXla9dY8gjIp+YfGPYq7p7ZMjXRD75xqebxSkAvA7g0Il9'
- 'Rx7Y23204lwKCI7EzN7OLP7x9Ls/Va76PYAMIKgOD1Hnw49x994D6Orfh9+dfUIL'
- 'EeX20xcvx1Tg2ssz16xceibu5u4lQi+fAtHMIj7UALAO4OCze85YlgTBAkkBJgCC'
- 'QSCMX5p4W7nq0gu/mQvSkyPnN7R2dwkh6yFkSgiZElI0Pnb8/M8B/AFATNrx0aZN'
- 'HX3NXb110rJsacUhpMBvf9D/DIB31gE8de5wnQnNB3/71YTt5nzXzft5z/FzRcdz'
- 'jDLu3Nj8+wDcyxe+9cjRc29esOJJAFz53s+tBOnp0U4AOPTd1x5vbN+6U1qxZOWf'
- 'lxbmrw3Nupm7d8rv1gD8+Y1JowN1KdXW8NaW3f1o375DdGxvlU1dPfLXg7vvlcft'
- 'GDj5op1IgcmsUa+wspBe+GR4BADaHto7IKSVXKsvY+aj9/4OYLImwFdPX/xR+5f3'
- '9QMiLgTqAZGEEPWh61iJDRuf9QvZEQCpzp0HT0ZzU7WiCYH01Og4gNknTv0kUZdq'
- 'OiaFBa5SyM3e83JLsx8AULUAmtu27TmfbGyxmbnKsMTSzbFbKiiGAHDwuVdPJBra'
- 'EmSoHBQYABNh7O0LfwGwOvePob6eR5/cH3gGoFI/MzKfz99NT304Ug1eAdjzjZdO'
- '1Td32TpQiPwzmAAixYuTYx8bFU4BkG1f6j/u5TRADOaSd2EjPTV0C4xxAGjvGxg0'
- 'KgXl6SpAxuL18XEA87UAxJZHnz5dzAQgKiMDzEDoOv78J0NXABR3HTu3Hdz8iJdV'
- '4HL0xJCWxLX3fnEVwA0AaNi8/3tuJgQxlcZECkxfeeOvAArrAHr7Tx2RsY5ud1VV'
- 'OWcwS6zMTc866U8/AsB1iS0HQy+2Wfk6UokAFgLFzI1cdn5yCEDw4P7BZ0CtjcVV'
- 'VVIJgLCwujBxR3nO2JrfpgQgWx742jd9R9tcFTkzQ4gYbg1fGgIwGw3fdDIoSBAZ'
- 'gLmUhwJLn45OM6lhAGjqPPIdd1WBKepnMAQkZj9+cxjAzX9fd+xtB15qJtN82HMM'
- 'eE30Atpf0sszw1cB5AF0W7FtA5HxaBwRQMbVy7evjgGwW7YdP2Z06wE3G+URU5QA'
- 'oX83WF0YvgIgWAcQuuFuUo19nlOKqgqAqd7e3Du4HyK2ktzw4POhmwKTrkTGBDBZ'
- 'dkffj8907oifYQZUkRCyiRQoTWNheeIWg0dq7Tu2tHqOhm4CZHQl88v0zMCmnlMv'
- 'M9PLTICbDSqZXz0GLEAUVpKSq/vJcHHl+iiYPq8JQGZjq+soMFFJ2pKBUuYylRKO'
- 'q+DK87/GIYNJRFNTbhPDmFzgF24MAdA1AfxC7h0mf5DZirJ6jaPICJUyntgApECs'
- 'NEgpIq3A2mcmn8l4zMUsmVyWKbvClFkmk/7CmM8W2Vy/Gh1XeD1A4ARXtH/tBDj1'
- 'Q+YNfeBYnCgMwfkiUT7P5GSZcsvMzhJT4R4zrQBmGawyxF6GzbJD5p8OkHcB+KVl'
- 'NixFTNX7wH87lMYB9ABoKe8tAFYBFKsM8/1z/P3yf1f+BRr3PuAGLe5KAAAAAElF'
- 'TkSuQmCC')
- return base64_decode(s)
-
-
-def urlserver_server_reply_list(conn, sort='-time'):
- """Send list of URLs as HTML page to client."""
- global urlserver, urlserver_settings
- content = '<div class="urls">\n<table id="urls_table">\n'
- if not sort.startswith('-'):
- sort = '+%s' % sort
- if sort[1:] == 'time':
- urls = sorted(urlserver['urls'].items())
- else:
- idx = ['time', 'nick', 'buffer'].index(sort[1:])
- urls = sorted(urlserver['urls'].items(),
- key=lambda url: url[1][idx].lower())
- if sort.startswith('-'):
- urls.reverse()
- sortkey = {
- '-': ('', '↑'),
- '+': ('-', '↓')
- }
- content += ' <tr>'
- for column, defaultsort in (('time', '-'), ('nick', ''), ('buffer', '')):
- if sort[1:] == column:
- content += ('<th class="sortable sorted_by %s_header">'
- '<a href="sort=%s%s">%s</a> %s</th>' % (
- column,
- sortkey[sort[0]][0],
- column, column.capitalize(),
- sortkey[sort[0]][1]))
- else:
- content += ('<th class="sortable %s_header">'
- '<a class="sort_link" href="sort=%s%s">%s</a></th>' % (
- column,
- defaultsort,
- column,
- column.capitalize()))
- content += '<th class="unsortable message_header">URLs</th>'
- content += '</tr>\n'
- for key, item in urls:
- content += ' <tr>'
- url = item[3]
- obj = ''
- message = (cgi.escape(item[4].replace(url, '\x01\x02\x03\x04'))
- .split('\t', 1))
- message[0] = '<span class="prefix">%s</span>' % message[0]
- message[1] = '<span class="message">%s</span>' % message[1]
-
- strjoin = ('<span class="prefix_suffix"> %s </span>' %
- urlserver_settings['http_prefix_suffix']
- .replace(' ', ' '))
-
- target = ''
- if urlserver_settings['http_open_in_new_page'] == 'on':
- target = ' target=_blank'
-
- message = strjoin.join(message).replace(
- '\x01\x02\x03\x04',
- '</span><a class="url" href="%s" title="%s"%s>%s'
- '</a><span class="message">' % (
- urlserver_short_url(key, False), url, target, url))
- if urlserver_settings['http_embed_image'] == 'on' and \
- url.lower().endswith(('.jpg', '.jpeg', '.png', '.gif',
- '.bmp', '.svg')):
- obj = ('<div class="obj"><img src="%s" title="%s" alt="%s">'
- '</div>' % (url, url, url))
- elif urlserver_settings['http_embed_youtube'] == 'on' and \
- 'youtube.com/' in url:
- m = re.search('v=([\w\d]+)', url)
- if m:
- yid = m.group(1)
- try:
- size = (urlserver_settings['http_embed_youtube_size']
- .split('*'))
- width = int(size[0])
- height = int(size[1])
- except:
- width = 480
- height = 350
- obj = ('<div class="obj youtube">'
- '<iframe id="%s" type="text/html" width="%d" '
- 'height="%d" '
- 'src="https://www.youtube.com/embed/%s?enablejsapi=1">'
- '</iframe></div>' % (yid, width, height, yid))
- content += ('<td class="timestamp">%s</td>'
- '<td class="nick">%s</td>'
- '<td class="buffer">%s</td><td class="message">' % (
- item[0], item[1], item[2]))
- content += '%s%s</td></tr>\n' % (message, obj)
- content += '</table>'
- if len(urlserver_settings['http_css_url']) > 0:
- css = ('<link rel="stylesheet" type="text/css" href="%s" />' %
- urlserver_settings['http_css_url'])
- else:
- css = ('<style type="text/css" media="screen">'
- '<!--\n'
- ' html { font-family: Verdana, Arial, Helvetica; '
- 'font-size: 12px; background: %s; color: %s }\n'
- ' .urls table { border-collapse: collapse }\n'
- ' .urls table td,th { border: solid 1px #cccccc; '
- 'padding: 4px; font-size: 12px }\n'
- ' .timestamp,.nick,.buffer { white-space: nowrap }\n'
- ' .sorted_by { font-style: italic; }\n'
- ' .obj { margin-top: 1em }\n'
- '-->'
- '</style>\n' % (
- urlserver_settings['http_bg_color'],
- urlserver_settings['http_fg_color']))
-
- html = ('<html>\n'
- '<head>\n'
- '<title>%s</title>\n'
- '<meta http-equiv="content-type" content="text/html; '
- 'charset=utf-8" />\n'
- '%s\n'
- '<base href="%s" />\n'
- '<link rel="icon" type="image/png" href="favicon.png" />\n'
- '</head>\n'
- '<body>\n%s\n</body>\n'
- '</html>' % (
- urlserver_settings['http_title'],
- css,
- urlserver_get_base_url(),
- content))
- urlserver_server_reply(conn, '200 OK', '', html)
-
-
-def urlserver_check_auth(data):
- """Check user/password to access a page/URL."""
- global urlserver_settings
- if not urlserver_settings['http_auth']:
- return True
- http_auth = weechat.string_eval_expression(
- urlserver_settings['http_auth'], {}, {}, {})
- auth = re.search('^Authorization: Basic (\S+)$', data,
- re.MULTILINE | re.IGNORECASE)
- if auth and (base64_decode(auth.group(1)).decode('utf-8') == http_auth):
- return True
- return False
-
-
-def urlserver_server_fd_cb(data, fd):
- """Callback for server socket."""
- global urlserver, urlserver_settings
- if not urlserver['socket']:
- return weechat.WEECHAT_RC_OK
- conn, addr = urlserver['socket'].accept()
- if urlserver_settings['debug'] == 'on':
- weechat.prnt('', 'urlserver: connection from %s' % str(addr))
- if urlserver_settings['http_allowed_ips'] and \
- not re.match(urlserver_settings['http_allowed_ips'], addr[0]):
- if urlserver_settings['debug'] == 'on':
- weechat.prnt('', 'urlserver: IP not allowed')
- conn.close()
- return weechat.WEECHAT_RC_OK
- data = None
- try:
- conn.settimeout(0.3)
- data = conn.recv(4096).decode('utf-8')
- data = data.replace('\r\n', '\n')
- except:
- return weechat.WEECHAT_RC_OK
- replysent = False
- sort = '-time'
- referer = re.search('^Referer:', data, re.MULTILINE | re.IGNORECASE)
- m = re.search('^GET /(.*) HTTP/.*$', data, re.MULTILINE)
- if m:
- url = m.group(1)
- if urlserver_settings['debug'] == 'on':
- weechat.prnt('', 'urlserver: %s' % m.group(0))
- if 'favicon.' in url:
- urlserver_server_reply(conn, '200 OK', '',
- urlserver_server_favicon(),
- mimetype='image/x-icon')
- replysent = True
- else:
- # check if prefix is ok (if prefix defined in settings)
- prefixok = True
- if urlserver_settings['http_url_prefix']:
- if url.startswith(urlserver_settings['http_url_prefix']):
- url = url[len(urlserver_settings['http_url_prefix']):]
- if url.startswith('/'):
- url = url[1:]
- else:
- prefixok = False
- # prefix ok, go on with url
- if prefixok:
- if url.startswith('sort='):
- # sort asked for list of urls
- sort = url[5:]
- url = ''
- if url:
- # short url, read base62 key and redirect to page
- number = -1
- try:
- number = base62_decode(url)
- except:
- pass
- if number >= 0 and number in urlserver['urls']:
- authok = (
- urlserver_settings['http_auth_redirect'] != 'on' or
- urlserver_check_auth(data)
- )
- if authok:
- # if we have a referer in request, use meta for
- # redirection (so that referer is not sent)
- # otherwise, we can make redirection with HTTP 302
- if referer:
- urlserver_server_reply(
- conn, '200 OK', '',
- '<meta name="referrer" content="never">\n'
- '<meta http-equiv="refresh" content="0; '
- 'url=%s">' % urlserver['urls'][number][3])
- else:
- conn.sendall(
- 'HTTP/1.1 302\r\n'
- 'Location: {}\r\n\r\n'
- .format(urlserver['urls'][number][3])
- .encode('utf-8'))
- else:
- urlserver_server_reply_auth_required(conn)
- replysent = True
- else:
- # page with list of urls
- if urlserver_check_auth(data):
- urlserver_server_reply_list(conn, sort)
- else:
- urlserver_server_reply_auth_required(conn)
- replysent = True
- else:
- if urlserver_settings['debug'] == 'on':
- weechat.prnt('', 'urlserver: prefix missing')
- if not replysent:
- urlserver_server_reply(conn,
- '404 Not found', '',
- '<html>\n'
- '<head><title>Page not found</title></head>\n'
- '<body><h1>Page not found</h1></body>\n'
- '</html>')
- conn.close()
- return weechat.WEECHAT_RC_OK
-
-
-def urlserver_server_status():
- """Display status of server."""
- global urlserver
- if urlserver['socket']:
- weechat.prnt('', 'URL server listening on %s' %
- str(urlserver['socket'].getsockname()))
- else:
- weechat.prnt('', 'URL server not running')
-
-
-def urlserver_server_start():
- """Start mini HTTP server."""
- global urlserver, urlserver_settings
- if urlserver['socket']:
- weechat.prnt('', 'URL server already running')
- return
- port = 0
- try:
- port = int(urlserver_settings['http_port'])
- except:
- port = 0
- urlserver['socket'] = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
- urlserver['socket'].setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
- try:
- urlserver['socket'].bind((urlserver_settings['http_hostname'] or
- socket.getfqdn(), port))
- except Exception as e:
- weechat.prnt('', '%sBind error: %s' % (weechat.prefix('error'), e))
- urlserver['socket'] = None
- urlserver_server_status()
- return
- urlserver['socket'].listen(5)
- urlserver['hook_fd'] = weechat.hook_fd(urlserver['socket'].fileno(),
- 1, 0, 0,
- 'urlserver_server_fd_cb', '')
- urlserver_server_status()
-
-
-def urlserver_server_stop():
- """Stop mini HTTP server."""
- global urlserver
- if urlserver['socket'] or urlserver['hook_fd']:
- if urlserver['socket']:
- urlserver['socket'].close()
- urlserver['socket'] = None
- if urlserver['hook_fd']:
- weechat.unhook(urlserver['hook_fd'])
- urlserver['hook_fd'] = None
- weechat.prnt('', 'URL server stopped')
-
-
-def urlserver_server_restart():
- """Restart mini HTTP server."""
- urlserver_server_stop()
- urlserver_server_start()
-
-
-def urlserver_display_url_detail(key, return_url=False):
- global urlserver
- url = urlserver['urls'][key]
- nick = url[1]
- if nick:
- nick += ' @ '
-
- if return_url:
- return urlserver_short_url(key)
- else:
- weechat.prnt_date_tags(
- urlserver['buffer'], 0, 'notify_none',
- '%s, %s%s%s%s: %s%s%s -> %s' % (
- url[0],
- nick,
- weechat.color('chat_buffer'),
- url[2],
- weechat.color('reset'),
- weechat.color(urlserver_settings['color']),
- urlserver_short_url(key),
- weechat.color('reset'),
- url[3]))
-
-
-def urlserver_buffer_input_cb(data, buffer, input_data):
- if input_data in ('q', 'Q'):
- weechat.buffer_close(buffer)
- return weechat.WEECHAT_RC_OK
-
-
-def urlserver_buffer_close_cb(data, buffer):
- global urlserver
- urlserver['buffer'] = ''
- return weechat.WEECHAT_RC_OK
-
-
-def urlserver_open_buffer():
- global urlserver, urlserver_settings
- if not urlserver['buffer']:
- urlserver['buffer'] = weechat.buffer_new(
- SCRIPT_BUFFER,
- 'urlserver_buffer_input_cb', '',
- 'urlserver_buffer_close_cb', '')
- if urlserver['buffer']:
- weechat.buffer_set(urlserver['buffer'], 'title', 'urlserver')
- weechat.buffer_set(urlserver['buffer'], 'localvar_set_no_log', '1')
- weechat.buffer_set(urlserver['buffer'], 'time_for_each_line', '0')
- weechat.buffer_set(urlserver['buffer'], 'print_hooks_enabled', '0')
- weechat.buffer_clear(urlserver['buffer'])
- keys = sorted(urlserver['urls'])
- for key in keys:
- urlserver_display_url_detail(key)
- weechat.buffer_set(urlserver['buffer'], 'display', '1')
-
-
-def urlserver_cmd_cb(data, buffer, args):
- """The /urlserver command."""
- global urlserver
- if args == 'start':
- urlserver_server_start()
- elif args == 'restart':
- urlserver_server_restart()
- elif args == 'stop':
- urlserver_server_stop()
- elif args == 'status':
- urlserver_server_status()
- elif args == 'clear':
- urlserver['urls'] = {}
- urlserver['number'] = 0
- weechat.prnt('', 'urlserver: list cleared')
- else:
- urlserver_open_buffer()
- return weechat.WEECHAT_RC_OK
-
-
-def urlserver_update_urllist(buffer_full_name, buffer_short_name, tags, prefix,
- message, nick=None):
- """Update urls list and return a list of short urls for message."""
- global urlserver, urlserver_settings
-
- # skip ignored buffers
- if urlserver_settings['msg_ignore_buffers'] and \
- buffer_full_name in (urlserver_settings['msg_ignore_buffers']
- .split(',')):
- return None
-
- listtags = []
- if tags:
- listtags = tags.split(',')
-
- # skip ignored tags
- if urlserver_settings['msg_ignore_tags']:
- for itag in urlserver_settings['msg_ignore_tags'].split(','):
- for tag in listtags:
- if tag.startswith(itag):
- return None
-
- # exit if a required tag is missing
- if urlserver_settings['msg_require_tags']:
- for rtag in urlserver_settings['msg_require_tags'].split(','):
- tagfound = False
- for tag in listtags:
- if tag.startswith(rtag):
- tagfound = True
- break
- if not tagfound:
- return None
-
- # ignore message is matching the "msg_ignore_regex"
- if urlserver_settings['msg_ignore_regex']:
- if re.search(urlserver_settings['msg_ignore_regex'],
- prefix + '\t' + message):
- return None
-
- # extract nick from tags
- if not nick:
- nick = ''
- for tag in listtags:
- if tag.startswith('nick_'):
- nick = tag[5:]
- break
-
- # get URL min length
- min_length = 0
- try:
- min_length = int(urlserver_settings['url_min_length'])
- # Detect the minimum length based on shorten url length
- if min_length == -1:
- min_length = len(urlserver_short_url(urlserver['number'])) + 1
- except:
- min_length = 0
-
- # shorten URL(s) in message
- urls_short = []
- for url in urlserver['regex'].findall(message):
- if len(url) >= min_length:
- if urlserver_settings['msg_ignore_dup_urls'] == 'on':
- same_urls = [key for key, value in urlserver['urls'].items()
- if value[3] == url]
- if same_urls:
- continue
- number = urlserver['number']
- # don't save urls already shortened
- if not url.startswith(urlserver_get_base_url()):
- urlserver['urls'][number] = (
- datetime.datetime.now().strftime(
- urlserver_settings['http_time_format']),
- nick,
- buffer_short_name,
- url,
- '%s\t%s' % (prefix, message))
- urls_short.append(urlserver_short_url(number))
- if urlserver['buffer']:
- urlserver_display_url_detail(number)
- urlserver['number'] += 1
-
- # remove old URLs if we have reach max list size
- urls_amount = 50
- try:
- urls_amount = int(urlserver_settings['urls_amount'])
- if urls_amount <= 0:
- urls_amount = 50
- except:
- urls_amount = 50
- while len(urlserver['urls']) > urls_amount:
- keys = sorted(urlserver['urls'])
- del urlserver['urls'][keys[0]]
-
- return urls_short
-
-
-def urlserver_print_cb(data, buffer, time, tags, displayed, highlight, prefix,
- message):
- """
- Callback for message printed in buffer: display short URLs after message.
- """
- global urlserver, urlserver_settings
-
- if not displayed and urlserver_settings['msg_filtered'] != 'on':
- return weechat.WEECHAT_RC_OK
-
- if urlserver_settings['display_urls'] == 'on':
- buffer_full_name = '%s.%s' % (
- weechat.buffer_get_string(buffer, 'plugin'),
- weechat.buffer_get_string(buffer, 'name'))
- if urlserver_settings['buffer_short_name'] == 'on':
- buffer_short_name = weechat.buffer_get_string(buffer, 'short_name')
- else:
- buffer_short_name = buffer_full_name
- urls_short = urlserver_update_urllist(buffer_full_name,
- buffer_short_name,
- tags,
- prefix,
- message)
- if urls_short:
- if urlserver_settings['separators'] and \
- len(urlserver_settings['separators']) == 3:
- separator = ' %s ' % (urlserver_settings['separators'][1])
- urls_string = separator.join(urls_short)
- urls_string = '%s %s %s' % (
- urlserver_settings['separators'][0],
- urls_string,
- urlserver_settings['separators'][2])
- else:
- urls_string = ' | '.join(urls_short)
- urls_string = '[ ' + urls_string + ' ]'
- weechat.prnt_date_tags(
- buffer, 0, 'no_log,notify_none',
- '%s%s' % (weechat.color(urlserver_settings['color']),
- urls_string))
-
- return weechat.WEECHAT_RC_OK
-
-
-def urlserver_modifier_irc_cb(data, modifier, modifier_data, string):
- """Modifier for IRC message: add short URLs at the end of IRC message."""
- global urlserver, urlserver_settings
-
- if urlserver_settings['display_urls_in_msg'] != 'on':
- return string
-
- msg = weechat.info_get_hashtable(
- 'irc_message_parse',
- {'message': string, 'server': modifier_data})
- if 'nick' not in msg or 'channel' not in msg or 'arguments' not in msg:
- return string
-
- try:
- message = msg['arguments'].split(' ', 1)[1]
- if message.startswith(':'):
- message = message[1:]
- except:
- return string
-
- info_name = '%s,%s' % (modifier_data, msg['channel'])
- if weechat.info_get('irc_is_channel', info_name) == '1':
- name = msg['channel']
- else:
- name = msg['nick']
- buffer_full_name = 'irc.%s.%s' % (modifier_data, name)
- if urlserver_settings['buffer_short_name'] == 'on':
- buffer_short_name = name
- else:
- buffer_short_name = buffer_full_name
- urls_short = urlserver_update_urllist(buffer_full_name,
- buffer_short_name,
- None,
- msg['nick'],
- message,
- msg['nick'])
- if urls_short:
- if urlserver_settings['separators'] and \
- len(urlserver_settings['separators']) == 3:
- separator = ' %s ' % (urlserver_settings['separators'][1])
- urls_string = separator.join(urls_short)
- urls_string = '%s %s %s' % (
- urlserver_settings['separators'][0],
- urls_string,
- urlserver_settings['separators'][2])
- else:
- urls_string = ' | '.join(urls_short)
- urls_string = '[ ' + urls_string + ' ]'
-
- if urlserver_settings['color_in_msg']:
- urls_string = '\x03%s%s' % (urlserver_settings['color_in_msg'],
- urls_string)
- string = "%s %s" % (string, urls_string)
-
- return string
-
-
-def urlserver_config_cb(data, option, value):
- """Called when a script option is changed."""
- global urlserver_settings
- pos = option.rfind('.')
- if pos > 0:
- name = option[pos+1:]
- if name in urlserver_settings:
- if name == 'http_allowed_ips':
- urlserver_settings[name] = re.compile(value)
- else:
- urlserver_settings[name] = value
- if name in ('http_hostname', 'http_port'):
- # don't restart if autostart is disabled and server isn't
- # already running
- if urlserver_settings['http_autostart'] == 'on' or \
- urlserver['socket']:
- urlserver_server_restart()
- return weechat.WEECHAT_RC_OK
-
-
-def urlserver_filename():
- """Return name of file used to store list of urls."""
- return os.path.join(weechat.info_get('weechat_dir', ''),
- 'urlserver_list.txt')
-
-
-def urlserver_read_urls():
- """Read file with URLs."""
- global urlserver
- filename = urlserver_filename()
- if os.path.isfile(filename):
- urlserver['number'] = 0
- try:
- urlserver['urls'] = ast.literal_eval(open(filename, 'r').read())
- keys = sorted(urlserver['urls'])
- if keys:
- urlserver['number'] = keys[-1] + 1
- else:
- urlserver['number'] = 0
- except:
- weechat.prnt('', '%surlserver: error reading file "%s"' % (
- weechat.prefix('error'),
- filename))
-
-
-def urlserver_write_urls():
- """Write file with URLs."""
- global urlserver
- keys = sorted(urlserver['urls'])
- content = '{\n%s\n}\n' % '\n'.join([
- ' %d: %s,' % (key, str(urlserver['urls'][key])) for key in keys
- ])
- open(urlserver_filename(), 'w').write(content)
-
-
-def urlserver_end():
- """Script unloaded (oh no, why?)"""
- urlserver_server_stop()
- urlserver_write_urls()
- return weechat.WEECHAT_RC_OK
-
-if __name__ == '__main__' and import_ok:
- if weechat.register(SCRIPT_NAME, SCRIPT_AUTHOR, SCRIPT_VERSION,
- SCRIPT_LICENSE, SCRIPT_DESC, 'urlserver_end', ''):
- # set default settings
- version = weechat.info_get('version_number', '') or 0
- for option, value in urlserver_settings_default.items():
- if weechat.config_is_set_plugin(option):
- urlserver_settings[option] = weechat.config_get_plugin(option)
- else:
- weechat.config_set_plugin(option, value[0])
- urlserver_settings[option] = value[0]
- if int(version) >= 0x00030500:
- weechat.config_set_desc_plugin(
- option,
- '%s (default: "%s")' % (value[1], value[0]))
-
- # detect config changes
- weechat.hook_config('plugins.var.python.%s.*' % SCRIPT_NAME,
- 'urlserver_config_cb', '')
-
- # add command
- weechat.hook_command(
- SCRIPT_COMMAND,
- SCRIPT_DESC,
- 'start|restart|stop|status || clear',
- ' start: start server\n'
- 'restart: restart server\n'
- ' stop: stop server\n'
- ' status: display status of server\n'
- ' clear: remove all URLs from list\n\n'
- 'Without argument, this command opens new buffer with list of '
- 'URLs.\n\n'
- 'Initial setup:\n'
- ' - by default, script will listen on a random free port, '
- 'you can force a port with:\n'
- ' /set plugins.var.python.urlserver.http_port "1234"\n'
- ' - you can force an IP or custom hostname with:\n'
- ' /set plugins.var.python.urlserver.http_hostname '
- '"111.22.33.44"\n'
- ' - it is strongly recommended to restrict IPs allowed and/or '
- 'use auth, for example:\n'
- ' /set plugins.var.python.urlserver.http_allowed_ips '
- '"^(123.45.67.89|192.160.*)$"\n'
- ' /set plugins.var.python.urlserver.http_auth '
- '"user:password"\n'
- ' - if you do not like the default HTML formatting, you can '
- 'override the CSS:\n'
- ' /set plugins.var.python.urlserver.http_css_url '
- '"http://example.com/sample.css"\n'
- ' See https://raw.github.com/FiXato/weechat_scripts/master/'
- 'urlserver/sample.css\n'
- ' - don\'t like the built-in HTTP server to start automatically? '
- 'Disable it:\n'
- ' /set plugins.var.python.urlserver.http_autostart "off"\n'
- ' - have external port 80 or 443 (https) forwarded to your '
- 'internal server port? Remove :port with:\n'
- ' /set plugins.var.python.urlserver.http_port_display "80" '
- 'or "443" respectively\n'
- '\n'
- 'Tip: use URL without key at the end to display list of all URLs '
- 'in your browser.',
- 'start|restart|stop|status|clear', 'urlserver_cmd_cb', '')
-
- if urlserver_settings['http_autostart'] == 'on':
- # start mini HTTP server
- urlserver_server_start()
-
- # load urls from file
- urlserver_read_urls()
-
- # catch URLs in buffers
- weechat.hook_print('', '', '://', 1, 'urlserver_print_cb', '')
-
- # modify URLS in irc messages (for relay)
- weechat.hook_modifier('irc_in2_privmsg',
- 'urlserver_modifier_irc_cb', '')
- weechat.hook_modifier('irc_in2_notice',
- 'urlserver_modifier_irc_cb', '')
-
- # search buffer
- urlserver['buffer'] = weechat.buffer_search('python', SCRIPT_BUFFER)
diff --git a/.weechat/relay.conf b/.weechat/relay.conf
deleted file mode 100644
index 565dd145..00000000
--- a/.weechat/relay.conf
+++ /dev/null
@@ -1,48 +0,0 @@
-#
-# weechat -- relay.conf
-#
-# WARNING: It is NOT recommended to edit this file by hand,
-# especially if WeeChat is running.
-#
-# Use /set or similar command to change settings in WeeChat.
-#
-# For more info, see: https://weechat.org/doc/quickstart
-#
-
-[look]
-auto_open_buffer = on
-raw_messages = 256
-
-[color]
-client = cyan
-status_active = lightblue
-status_auth_failed = lightred
-status_connecting = yellow
-status_disconnected = lightred
-status_waiting_auth = brown
-text = default
-text_bg = default
-text_selected = white
-
-[network]
-allow_empty_password = off
-allowed_ips = ""
-bind_address = ""
-clients_purge_delay = 0
-compression_level = 6
-ipv6 = on
-max_clients = 5
-password = ""
-ssl_cert_key = "%h/ssl/relay.pem"
-ssl_priorities = "NORMAL:-VERS-SSL3.0"
-websocket_allowed_origins = ""
-
-[irc]
-backlog_max_minutes = 1440
-backlog_max_number = 256
-backlog_since_last_disconnect = on
-backlog_since_last_message = off
-backlog_tags = "irc_privmsg"
-backlog_time_format = "[%H:%M] "
-
-[port]
diff --git a/.weechat/script.conf b/.weechat/script.conf
deleted file mode 100644
index 445a2d69..00000000
--- a/.weechat/script.conf
+++ /dev/null
@@ -1,56 +0,0 @@
-#
-# weechat -- script.conf
-#
-# WARNING: It is NOT recommended to edit this file by hand,
-# especially if WeeChat is running.
-#
-# Use /set or similar command to change settings in WeeChat.
-#
-# For more info, see: https://weechat.org/doc/quickstart
-#
-
-[look]
-columns = "%s %n %V %v %u | %d | %t"
-diff_color = on
-diff_command = "auto"
-display_source = on
-quiet_actions = on
-sort = "p,n"
-translate_description = on
-use_keys = on
-
-[color]
-status_autoloaded = cyan
-status_held = white
-status_installed = lightcyan
-status_obsolete = lightmagenta
-status_popular = yellow
-status_running = lightgreen
-status_unknown = lightred
-text = default
-text_bg = default
-text_bg_selected = red
-text_date = default
-text_date_selected = white
-text_delimiters = default
-text_description = default
-text_description_selected = white
-text_extension = default
-text_extension_selected = white
-text_name = cyan
-text_name_selected = lightcyan
-text_selected = white
-text_tags = brown
-text_tags_selected = yellow
-text_version = magenta
-text_version_loaded = default
-text_version_loaded_selected = white
-text_version_selected = lightmagenta
-
-[scripts]
-autoload = on
-cache_expire = 1440
-download_timeout = 30
-hold = ""
-path = "%h/script"
-url = "http://weechat.org/files/plugins.xml.gz"
diff --git a/.weechat/trigger.conf b/.weechat/trigger.conf
deleted file mode 100644
index c2f63f99..00000000
--- a/.weechat/trigger.conf
+++ /dev/null
@@ -1,115 +0,0 @@
-#
-# weechat -- trigger.conf
-#
-# WARNING: It is NOT recommended to edit this file by hand,
-# especially if WeeChat is running.
-#
-# Use /set or similar command to change settings in WeeChat.
-#
-# For more info, see: https://weechat.org/doc/quickstart
-#
-
-[look]
-enabled = on
-monitor_strip_colors = off
-
-[color]
-flag_command = lightgreen
-flag_conditions = yellow
-flag_post_action = lightblue
-flag_regex = lightcyan
-flag_return_code = lightmagenta
-regex = white
-replace = cyan
-trigger = green
-trigger_disabled = red
-
-[trigger]
-beep.arguments = ""
-beep.command = "/print -beep"
-beep.conditions = "${tg_displayed} && (${tg_highlight} || ${tg_msg_pv})"
-beep.enabled = on
-beep.hook = print
-beep.post_action = none
-beep.regex = ""
-beep.return_code = ok
-bufferswitch.arguments = "buffer_switch"
-bufferswitch.command = "/perlexec weechat::buffer_set(weechat::hdata_get_list(weechat::hdata_get('buffer'),'gui_buffer_last_displayed'), 'unread', 0)\;"
-bufferswitch.conditions = ""
-bufferswitch.enabled = on
-bufferswitch.hook = signal
-bufferswitch.post_action = none
-bufferswitch.regex = ""
-bufferswitch.return_code = ok
-cmd_pass.arguments = "5000|input_text_display;5000|history_add;5000|irc_command_auth"
-cmd_pass.command = ""
-cmd_pass.conditions = ""
-cmd_pass.enabled = on
-cmd_pass.hook = modifier
-cmd_pass.post_action = none
-cmd_pass.regex = "==^((/(msg|m|quote) +nickserv +(id|identify|register|ghost +[^ ]+|release +[^ ]+|regain +[^ ]+|recover +[^ ]+) +)|/oper +[^ ]+ +|/quote +pass +|/set +[^ ]*password[^ ]* +|/secure +(passphrase|decrypt|set +[^ ]+) +)(.*)==${re:1}${hide:*,${re:+}}"
-cmd_pass.return_code = ok
-detach.arguments = "10000;0;0"
-detach.command = "/allchan /eval /perlexec weechat::command('', '/command -buffer irc.\${server}.\${channel} core /buffer hide') if ((${date:%s} - \${buffer[\${info:irc_buffer,\${server},\${channel}}].lines.last_line.data.date}) > 100 && '\${window.buffer.full_name}' !~ 'irc.\${server}.\${channel}' && '\${buffer[\${info:irc_buffer,\${server},\${channel}}].hotlist}' eq '0x0')"
-detach.conditions = ""
-detach.enabled = on
-detach.hook = timer
-detach.post_action = none
-detach.regex = ""
-detach.return_code = ok
-force_redraw.arguments = "window_switch;buffer_switch"
-force_redraw.command = "/wait 1ms /redraw"
-force_redraw.conditions = ""
-force_redraw.enabled = on
-force_redraw.hook = signal
-force_redraw.post_action = none
-force_redraw.regex = ""
-force_redraw.return_code = ok
-msg_auth.arguments = "5000|irc_message_auth"
-msg_auth.command = ""
-msg_auth.conditions = ""
-msg_auth.enabled = on
-msg_auth.hook = modifier
-msg_auth.post_action = none
-msg_auth.regex = "==^(.*(id|identify|register|ghost +[^ ]+|release +[^ ]+|regain +[^ ]+|recover +[^ ]+) +)(.*)==${re:1}${hide:*,${re:+}}"
-msg_auth.return_code = ok
-reattach.arguments = ""
-reattach.command = "/command -buffer irc.$server.$channel core /buffer unhide"
-reattach.conditions = "${buffer.hidden} == 1 && ${tg_tag_notify} == message"
-reattach.enabled = on
-reattach.hook = print
-reattach.post_action = none
-reattach.regex = ""
-reattach.return_code = ok
-reattach_on_switch.arguments = "buffer_switch"
-reattach_on_switch.command = "/command -buffer ${buffer[${tg_signal_data}].full_name} core /buffer unhide"
-reattach_on_switch.conditions = "${buffer[${tg_signal_data}].hidden} == 1"
-reattach_on_switch.enabled = on
-reattach_on_switch.hook = signal
-reattach_on_switch.post_action = none
-reattach_on_switch.regex = ""
-reattach_on_switch.return_code = ok
-server_pass.arguments = "5000|input_text_display;5000|history_add"
-server_pass.command = ""
-server_pass.conditions = ""
-server_pass.enabled = on
-server_pass.hook = modifier
-server_pass.post_action = none
-server_pass.regex = "==^(/(server|connect) .*-(sasl_)?password=)([^ ]+)(.*)==${re:1}${hide:*,${re:4}}${re:5}"
-server_pass.return_code = ok
-windowswitch.arguments = "window_switch"
-windowswitch.command = "/perlexec weechat::buffer_set(weechat::window_get_pointer('${tg_signal_data}','buffer'), 'hotlist', -1);"
-windowswitch.conditions = ""
-windowswitch.enabled = on
-windowswitch.hook = signal
-windowswitch.post_action = none
-windowswitch.regex = ""
-windowswitch.return_code = ok
-znctoserver.arguments = "irc_in_privmsg"
-znctoserver.command = "/print -buffer server.${server} znc: ${text}"
-znctoserver.conditions = "${host} == *status!znc@znc.in || ${host} == *controlpanel!znc@znc.in || ${host} == *identfile!znc@znc.in || ${host} == *q!znc@znc.in"
-znctoserver.enabled = on
-znctoserver.hook = modifier
-znctoserver.post_action = none
-znctoserver.regex = "/.*//"
-znctoserver.return_code = ok
diff --git a/.weechat/weechat.conf b/.weechat/weechat.conf
deleted file mode 100644
index 4fbd3be4..00000000
--- a/.weechat/weechat.conf
+++ /dev/null
@@ -1,648 +0,0 @@
-#
-# weechat -- weechat.conf
-#
-# WARNING: It is NOT recommended to edit this file by hand,
-# especially if WeeChat is running.
-#
-# Use /set or similar command to change settings in WeeChat.
-#
-# For more info, see: https://weechat.org/doc/quickstart
-#
-
-[debug]
-
-[startup]
-command_after_plugins = ""
-command_before_plugins = ""
-display_logo = on
-display_version = on
-sys_rlimit = ""
-
-[look]
-align_end_of_lines = message
-align_multiline_words = on
-bar_more_down = "++"
-bar_more_left = "<<"
-bar_more_right = ">>"
-bar_more_up = "--"
-bare_display_exit_on_input = on
-bare_display_time_format = "%H:%M"
-buffer_auto_renumber = on
-buffer_notify_default = all
-buffer_position = end
-buffer_search_case_sensitive = off
-buffer_search_force_default = off
-buffer_search_regex = off
-buffer_search_where = prefix_message
-buffer_time_format = "${253}%H:${245}%M"
-color_basic_force_bold = off
-color_inactive_buffer = on
-color_inactive_message = on
-color_inactive_prefix = on
-color_inactive_prefix_buffer = on
-color_inactive_time = off
-color_inactive_window = on
-color_nick_offline = off
-color_pairs_auto_reset = 5
-color_real_white = off
-command_chars = ""
-command_incomplete = off
-confirm_quit = off
-confirm_upgrade = off
-day_change = on
-day_change_message_1date = "-- %a, %d %b %Y --"
-day_change_message_2dates = "-- %%a, %%d %%b %%Y (%a, %d %b %Y) --"
-eat_newline_glitch = off
-emphasized_attributes = ""
-highlight = "alpha,kejadlen"
-highlight_regex = ""
-highlight_tags = ""
-hotlist_add_conditions = "${away} || ${buffer} != ${window.buffer}"
-hotlist_buffer_separator = ", "
-hotlist_count_max = 2
-hotlist_count_min_msg = 2
-hotlist_names_count = 3
-hotlist_names_length = 0
-hotlist_names_level = 12
-hotlist_names_merged_buffers = off
-hotlist_prefix = "H: "
-hotlist_remove = merged
-hotlist_short_names = on
-hotlist_sort = group_time_asc
-hotlist_suffix = ""
-hotlist_unique_numbers = on
-input_cursor_scroll = 20
-input_share = none
-input_share_overwrite = off
-input_undo_max = 32
-item_away_message = on
-item_buffer_filter = "*"
-item_buffer_zoom = "!"
-item_mouse_status = "M"
-item_time_format = "%H:%M"
-jump_current_to_previous_buffer = on
-jump_previous_buffer_when_closing = on
-jump_smart_back_to_buffer = on
-key_bind_safe = on
-key_grab_delay = 800
-mouse = off
-mouse_timer_delay = 100
-nick_color_force = ""
-nick_color_hash = djb2
-nick_color_stop_chars = "_|["
-nick_prefix = ""
-nick_suffix = ""
-paste_auto_add_newline = on
-paste_bracketed = on
-paste_bracketed_timer_delay = 10
-paste_max_lines = 1
-prefix_action = " *"
-prefix_align = right
-prefix_align_max = 0
-prefix_align_min = 0
-prefix_align_more = "+"
-prefix_align_more_after = on
-prefix_buffer_align = right
-prefix_buffer_align_max = 0
-prefix_buffer_align_more = "+"
-prefix_buffer_align_more_after = on
-prefix_error = "=!="
-prefix_join = "-->"
-prefix_network = "--"
-prefix_quit = "<--"
-prefix_same_nick = ""
-prefix_suffix = "|"
-quote_nick_prefix = "<"
-quote_nick_suffix = ">"
-quote_time_format = "%H:%M:%S"
-read_marker = line
-read_marker_always_show = off
-read_marker_string = "- "
-save_config_on_exit = on
-save_layout_on_exit = none
-scroll_amount = 3
-scroll_bottom_after_switch = off
-scroll_page_percent = 100
-search_text_not_found_alert = on
-separator_horizontal = "-"
-separator_vertical = ""
-tab_width = 1
-time_format = "%a, %d %b %Y %T"
-window_auto_zoom = off
-window_separator_horizontal = on
-window_separator_vertical = on
-window_title = "WeeChat ${info:version}"
-word_chars_highlight = "!\u00A0,-,_,|,alnum"
-word_chars_input = "!\u00A0,-,_,|,alnum"
-
-[palette]
-
-[color]
-bar_more = lightmagenta
-chat = default
-chat_bg = default
-chat_buffer = white
-chat_channel = white
-chat_day_change = cyan
-chat_delimiters = green
-chat_highlight = yellow
-chat_highlight_bg = magenta
-chat_host = cyan
-chat_inactive_buffer = default
-chat_inactive_window = default
-chat_nick = lightcyan
-chat_nick_colors = "red,green,brown,blue,magenta,cyan,white,lightred,lightgreen,yellow,lightblue,lightmagenta,lightcyan"
-chat_nick_offline = default
-chat_nick_offline_highlight = default
-chat_nick_offline_highlight_bg = blue
-chat_nick_other = cyan
-chat_nick_prefix = green
-chat_nick_self = white
-chat_nick_suffix = green
-chat_prefix_action = white
-chat_prefix_buffer = brown
-chat_prefix_buffer_inactive_buffer = default
-chat_prefix_error = yellow
-chat_prefix_join = lightgreen
-chat_prefix_more = lightmagenta
-chat_prefix_network = magenta
-chat_prefix_quit = lightred
-chat_prefix_suffix = green
-chat_read_marker = magenta
-chat_read_marker_bg = default
-chat_server = brown
-chat_tags = red
-chat_text_found = yellow
-chat_text_found_bg = lightmagenta
-chat_time = default
-chat_time_delimiters = brown
-chat_value = cyan
-chat_value_null = blue
-emphasized = yellow
-emphasized_bg = magenta
-input_actions = lightgreen
-input_text_not_found = red
-item_away = yellow
-nicklist_away = cyan
-nicklist_group = green
-separator = blue
-status_count_highlight = magenta
-status_count_msg = brown
-status_count_other = default
-status_count_private = green
-status_data_highlight = lightmagenta
-status_data_msg = yellow
-status_data_other = default
-status_data_private = lightgreen
-status_filter = green
-status_more = yellow
-status_mouse = green
-status_name = white
-status_name_ssl = lightgreen
-status_nicklist_count = default
-status_number = yellow
-status_time = default
-
-[completion]
-base_word_until_cursor = on
-command_inline = on
-default_template = "%(nicks)|%(irc_channels)"
-nick_add_space = on
-nick_case_sensitive = off
-nick_completer = ":"
-nick_first_only = off
-nick_ignore_chars = "[]`_-^"
-partial_completion_alert = on
-partial_completion_command = off
-partial_completion_command_arg = off
-partial_completion_count = on
-partial_completion_other = off
-
-[history]
-display_default = 5
-max_buffer_lines_minutes = 0
-max_buffer_lines_number = 4096
-max_commands = 100
-max_visited_buffers = 50
-
-[proxy]
-
-[network]
-connection_timeout = 60
-gnutls_ca_file = "/usr/local/etc/openssl/cert.pem"
-gnutls_handshake_timeout = 30
-proxy_curl = ""
-
-[plugin]
-autoload = "*"
-debug = off
-extension = ".so,.dll"
-path = "%h/plugins"
-save_config_on_unload = on
-
-[bar]
-buflist.color_bg = default
-buflist.color_delim = default
-buflist.color_fg = default
-buflist.conditions = ""
-buflist.filling_left_right = vertical
-buflist.filling_top_bottom = columns_vertical
-buflist.hidden = off
-buflist.items = "buflist"
-buflist.position = top
-buflist.priority = 0
-buflist.separator = on
-buflist.size = 0
-buflist.size_max = 0
-buflist.type = root
-input.color_bg = default
-input.color_delim = cyan
-input.color_fg = default
-input.conditions = ""
-input.filling_left_right = vertical
-input.filling_top_bottom = horizontal
-input.hidden = off
-input.items = "[input_prompt]+(away),[input_search],[input_paste],input_text"
-input.position = bottom
-input.priority = 1000
-input.separator = off
-input.size = 1
-input.size_max = 0
-input.type = window
-isetbar.color_bg = default
-isetbar.color_delim = cyan
-isetbar.color_fg = default
-isetbar.conditions = ""
-isetbar.filling_left_right = vertical
-isetbar.filling_top_bottom = horizontal
-isetbar.hidden = on
-isetbar.items = "isetbar_help"
-isetbar.position = top
-isetbar.priority = 0
-isetbar.separator = on
-isetbar.size = 3
-isetbar.size_max = 3
-isetbar.type = window
-nicklist.color_bg = default
-nicklist.color_delim = cyan
-nicklist.color_fg = default
-nicklist.conditions = "${nicklist}"
-nicklist.filling_left_right = vertical
-nicklist.filling_top_bottom = columns_vertical
-nicklist.hidden = on
-nicklist.items = "buffer_nicklist"
-nicklist.position = right
-nicklist.priority = 200
-nicklist.separator = on
-nicklist.size = 0
-nicklist.size_max = 0
-nicklist.type = window
-status.color_bg = black
-status.color_delim = cyan
-status.color_fg = default
-status.conditions = ""
-status.filling_left_right = vertical
-status.filling_top_bottom = horizontal
-status.hidden = off
-status.items = "[time],[buffer_last_number],[buffer_plugin],buffer_number+:+buffer_name+(buffer_modes)+{buffer_nicklist_count}+buffer_zoom+buffer_filter,scroll,[lag],[hotlist],completion"
-status.position = bottom
-status.priority = 500
-status.separator = off
-status.size = 1
-status.size_max = 0
-status.type = window
-title.color_bg = black
-title.color_delim = cyan
-title.color_fg = default
-title.conditions = ""
-title.filling_left_right = vertical
-title.filling_top_bottom = horizontal
-title.hidden = off
-title.items = "buffer_title"
-title.position = top
-title.priority = 500
-title.separator = off
-title.size = 1
-title.size_max = 0
-title.type = window
-
-[layout]
-_zoom.window = "1;0;0;0;irc;pivotal.alidaka"
-
-[notify]
-
-[filter]
-irc_smart = on;*;irc_smart_filter;*
-irc_disconnected = on;*;*;^irc: disconnected from server$
-alpha_join = on;*;irc_join,host_alpha;*
-
-[key]
-ctrl-? = "/input delete_previous_char"
-ctrl-A = "/input move_beginning_of_line"
-ctrl-B = "/input move_previous_char"
-ctrl-C_ = "/input insert \x1F"
-ctrl-Cb = "/input insert \x02"
-ctrl-Cc = "/input insert \x03"
-ctrl-Ci = "/input insert \x1D"
-ctrl-Co = "/input insert \x0F"
-ctrl-Cv = "/input insert \x16"
-ctrl-D = "/input delete_next_char"
-ctrl-E = "/input move_end_of_line"
-ctrl-F = "/input move_next_char"
-ctrl-H = "/input delete_previous_char"
-ctrl-I = "/input complete_next"
-ctrl-J = "/input return"
-ctrl-K = "/input delete_end_of_line"
-ctrl-L = "/window refresh"
-ctrl-M = "/input return"
-ctrl-N = "/buffer +1"
-ctrl-P = "/buffer -1"
-ctrl-R = "/input search_text_here"
-ctrl-Sctrl-U = "/input set_unread"
-ctrl-T = "/input transpose_chars"
-ctrl-U = "/input delete_beginning_of_line"
-ctrl-W = "/input delete_previous_word"
-ctrl-X = "/input switch_active_buffer"
-ctrl-Y = "/input clipboard_paste"
-meta-meta-OP = "/bar scroll buflist * b"
-meta-meta-OQ = "/bar scroll buflist * e"
-meta-meta2-1~ = "/window scroll_top"
-meta-meta2-23~ = "/bar scroll nicklist * b"
-meta-meta2-24~ = "/bar scroll nicklist * e"
-meta-meta2-4~ = "/window scroll_bottom"
-meta-meta2-5~ = "/window scroll_up"
-meta-meta2-6~ = "/window scroll_down"
-meta-meta2-7~ = "/window scroll_top"
-meta-meta2-8~ = "/window scroll_bottom"
-meta-meta2-A = "/buffer -1"
-meta-meta2-B = "/buffer +1"
-meta-meta2-C = "/buffer +1"
-meta-meta2-D = "/buffer -1"
-meta-- = "/filter toggle @"
-meta-/ = "/input jump_last_buffer_displayed"
-meta-0 = "/buffer *10"
-meta-1 = "/buffer *1"
-meta-2 = "/buffer *2"
-meta-3 = "/buffer *3"
-meta-4 = "/buffer *4"
-meta-5 = "/buffer *5"
-meta-6 = "/buffer *6"
-meta-7 = "/buffer *7"
-meta-8 = "/buffer *8"
-meta-9 = "/buffer *9"
-meta-< = "/input jump_previously_visited_buffer"
-meta-= = "/filter toggle"
-meta-> = "/input jump_next_visited_buffer"
-meta-OA = "/input history_global_previous"
-meta-OB = "/input history_global_next"
-meta-OC = "/input move_next_word"
-meta-OD = "/input move_previous_word"
-meta-OF = "/input move_end_of_line"
-meta-OH = "/input move_beginning_of_line"
-meta-OP = "/bar scroll buflist * -100%"
-meta-OQ = "/bar scroll buflist * +100%"
-meta-Oa = "/input history_global_previous"
-meta-Ob = "/input history_global_next"
-meta-Oc = "/input move_next_word"
-meta-Od = "/input move_previous_word"
-meta2-15~ = "/buffer -1"
-meta2-17~ = "/buffer +1"
-meta2-18~ = "/window -1"
-meta2-19~ = "/window +1"
-meta2-1;3A = "/buffer -1"
-meta2-1;3B = "/buffer +1"
-meta2-1;3C = "/buffer +1"
-meta2-1;3D = "/buffer -1"
-meta2-1;3F = "/window scroll_bottom"
-meta2-1;3H = "/window scroll_top"
-meta2-1;5A = "/input history_global_previous"
-meta2-1;5B = "/input history_global_next"
-meta2-1;5C = "/input move_next_word"
-meta2-1;5D = "/input move_previous_word"
-meta2-1~ = "/input move_beginning_of_line"
-meta2-200~ = "/input paste_start"
-meta2-201~ = "/input paste_stop"
-meta2-20~ = "/bar scroll title * -30%"
-meta2-21~ = "/bar scroll title * +30%"
-meta2-23;3~ = "/bar scroll nicklist * b"
-meta2-23~ = "/bar scroll nicklist * -100%"
-meta2-24;3~ = "/bar scroll nicklist * e"
-meta2-24~ = "/bar scroll nicklist * +100%"
-meta2-3~ = "/input delete_next_char"
-meta2-4~ = "/input move_end_of_line"
-meta2-5;3~ = "/window scroll_up"
-meta2-5~ = "/window page_up"
-meta2-6;3~ = "/window scroll_down"
-meta2-6~ = "/window page_down"
-meta2-7~ = "/input move_beginning_of_line"
-meta2-8~ = "/input move_end_of_line"
-meta2-A = "/input history_previous"
-meta2-B = "/input history_next"
-meta2-C = "/input move_next_char"
-meta2-D = "/input move_previous_char"
-meta2-F = "/input move_end_of_line"
-meta2-G = "/window page_down"
-meta2-H = "/input move_beginning_of_line"
-meta2-I = "/window page_up"
-meta2-Z = "/input complete_previous"
-meta2-[E = "/buffer -1"
-meta-_ = "/input redo"
-meta-a = "/input jump_smart"
-meta-b = "/input move_previous_word"
-meta-d = "/input delete_next_word"
-meta-f = "/input move_next_word"
-meta-h = "/input hotlist_clear"
-meta-jmeta-f = "/buffer -"
-meta-jmeta-l = "/buffer +"
-meta-jmeta-r = "/server raw"
-meta-jmeta-s = "/server jump"
-meta-j01 = "/buffer *1"
-meta-j02 = "/buffer *2"
-meta-j03 = "/buffer *3"
-meta-j04 = "/buffer *4"
-meta-j05 = "/buffer *5"
-meta-j06 = "/buffer *6"
-meta-j07 = "/buffer *7"
-meta-j08 = "/buffer *8"
-meta-j09 = "/buffer *9"
-meta-j10 = "/buffer *10"
-meta-j11 = "/buffer *11"
-meta-j12 = "/buffer *12"
-meta-j13 = "/buffer *13"
-meta-j14 = "/buffer *14"
-meta-j15 = "/buffer *15"
-meta-j16 = "/buffer *16"
-meta-j17 = "/buffer *17"
-meta-j18 = "/buffer *18"
-meta-j19 = "/buffer *19"
-meta-j20 = "/buffer *20"
-meta-j21 = "/buffer *21"
-meta-j22 = "/buffer *22"
-meta-j23 = "/buffer *23"
-meta-j24 = "/buffer *24"
-meta-j25 = "/buffer *25"
-meta-j26 = "/buffer *26"
-meta-j27 = "/buffer *27"
-meta-j28 = "/buffer *28"
-meta-j29 = "/buffer *29"
-meta-j30 = "/buffer *30"
-meta-j31 = "/buffer *31"
-meta-j32 = "/buffer *32"
-meta-j33 = "/buffer *33"
-meta-j34 = "/buffer *34"
-meta-j35 = "/buffer *35"
-meta-j36 = "/buffer *36"
-meta-j37 = "/buffer *37"
-meta-j38 = "/buffer *38"
-meta-j39 = "/buffer *39"
-meta-j40 = "/buffer *40"
-meta-j41 = "/buffer *41"
-meta-j42 = "/buffer *42"
-meta-j43 = "/buffer *43"
-meta-j44 = "/buffer *44"
-meta-j45 = "/buffer *45"
-meta-j46 = "/buffer *46"
-meta-j47 = "/buffer *47"
-meta-j48 = "/buffer *48"
-meta-j49 = "/buffer *49"
-meta-j50 = "/buffer *50"
-meta-j51 = "/buffer *51"
-meta-j52 = "/buffer *52"
-meta-j53 = "/buffer *53"
-meta-j54 = "/buffer *54"
-meta-j55 = "/buffer *55"
-meta-j56 = "/buffer *56"
-meta-j57 = "/buffer *57"
-meta-j58 = "/buffer *58"
-meta-j59 = "/buffer *59"
-meta-j60 = "/buffer *60"
-meta-j61 = "/buffer *61"
-meta-j62 = "/buffer *62"
-meta-j63 = "/buffer *63"
-meta-j64 = "/buffer *64"
-meta-j65 = "/buffer *65"
-meta-j66 = "/buffer *66"
-meta-j67 = "/buffer *67"
-meta-j68 = "/buffer *68"
-meta-j69 = "/buffer *69"
-meta-j70 = "/buffer *70"
-meta-j71 = "/buffer *71"
-meta-j72 = "/buffer *72"
-meta-j73 = "/buffer *73"
-meta-j74 = "/buffer *74"
-meta-j75 = "/buffer *75"
-meta-j76 = "/buffer *76"
-meta-j77 = "/buffer *77"
-meta-j78 = "/buffer *78"
-meta-j79 = "/buffer *79"
-meta-j80 = "/buffer *80"
-meta-j81 = "/buffer *81"
-meta-j82 = "/buffer *82"
-meta-j83 = "/buffer *83"
-meta-j84 = "/buffer *84"
-meta-j85 = "/buffer *85"
-meta-j86 = "/buffer *86"
-meta-j87 = "/buffer *87"
-meta-j88 = "/buffer *88"
-meta-j89 = "/buffer *89"
-meta-j90 = "/buffer *90"
-meta-j91 = "/buffer *91"
-meta-j92 = "/buffer *92"
-meta-j93 = "/buffer *93"
-meta-j94 = "/buffer *94"
-meta-j95 = "/buffer *95"
-meta-j96 = "/buffer *96"
-meta-j97 = "/buffer *97"
-meta-j98 = "/buffer *98"
-meta-j99 = "/buffer *99"
-meta-k = "/input grab_key_command"
-meta-l = "/window bare"
-meta-m = "/mute mouse toggle"
-meta-n = "/window scroll_next_highlight"
-meta-p = "/window scroll_previous_highlight"
-meta-r = "/input delete_line"
-meta-s = "/mute aspell toggle"
-meta-u = "/window scroll_unread"
-meta-wmeta-meta2-A = "/window up"
-meta-wmeta-meta2-B = "/window down"
-meta-wmeta-meta2-C = "/window right"
-meta-wmeta-meta2-D = "/window left"
-meta-wmeta2-1;3A = "/window up"
-meta-wmeta2-1;3B = "/window down"
-meta-wmeta2-1;3C = "/window right"
-meta-wmeta2-1;3D = "/window left"
-meta-wmeta-b = "/window balance"
-meta-wmeta-s = "/window swap"
-meta-x = "/input zoom_merged_buffer"
-meta-z = "/window zoom"
-ctrl-_ = "/input undo"
-
-[key_search]
-ctrl-I = "/input search_switch_where"
-ctrl-J = "/input search_stop_here"
-ctrl-M = "/input search_stop_here"
-ctrl-Q = "/input search_stop"
-ctrl-R = "/input search_switch_regex"
-meta2-A = "/input search_previous"
-meta2-B = "/input search_next"
-meta-c = "/input search_switch_case"
-
-[key_cursor]
-ctrl-J = "/cursor stop"
-ctrl-M = "/cursor stop"
-meta-meta2-A = "/cursor move area_up"
-meta-meta2-B = "/cursor move area_down"
-meta-meta2-C = "/cursor move area_right"
-meta-meta2-D = "/cursor move area_left"
-meta2-1;3A = "/cursor move area_up"
-meta2-1;3B = "/cursor move area_down"
-meta2-1;3C = "/cursor move area_right"
-meta2-1;3D = "/cursor move area_left"
-meta2-A = "/cursor move up"
-meta2-B = "/cursor move down"
-meta2-C = "/cursor move right"
-meta2-D = "/cursor move left"
-@item(buffer_nicklist):K = "/window ${_window_number};/kickban ${nick}"
-@item(buffer_nicklist):b = "/window ${_window_number};/ban ${nick}"
-@item(buffer_nicklist):k = "/window ${_window_number};/kick ${nick}"
-@item(buffer_nicklist):q = "/window ${_window_number};/query ${nick};/cursor stop"
-@item(buffer_nicklist):w = "/window ${_window_number};/whois ${nick}"
-@chat:Q = "hsignal:chat_quote_time_prefix_message;/cursor stop"
-@chat:m = "hsignal:chat_quote_message;/cursor stop"
-@chat:q = "hsignal:chat_quote_prefix_message;/cursor stop"
-
-[key_mouse]
-@bar(buflist):ctrl-wheeldown = "hsignal:buflist_mouse"
-@bar(buflist):ctrl-wheelup = "hsignal:buflist_mouse"
-@bar(input):button2 = "/input grab_mouse_area"
-@bar(nicklist):button1-gesture-down = "/bar scroll nicklist ${_window_number} +100%"
-@bar(nicklist):button1-gesture-down-long = "/bar scroll nicklist ${_window_number} e"
-@bar(nicklist):button1-gesture-up = "/bar scroll nicklist ${_window_number} -100%"
-@bar(nicklist):button1-gesture-up-long = "/bar scroll nicklist ${_window_number} b"
-@chat(perl.iset):button1 = "hsignal:iset_mouse"
-@chat(perl.iset):button2* = "hsignal:iset_mouse"
-@chat(perl.iset):wheeldown = "/repeat 5 /iset **down"
-@chat(perl.iset):wheelup = "/repeat 5 /iset **up"
-@chat(script.scripts):button1 = "/window ${_window_number};/script go ${_chat_line_y}"
-@chat(script.scripts):button2 = "/window ${_window_number};/script go ${_chat_line_y};/script installremove -q ${script_name_with_extension}"
-@chat(script.scripts):wheeldown = "/script down 5"
-@chat(script.scripts):wheelup = "/script up 5"
-@item(buffer_nicklist):button1 = "/window ${_window_number};/query ${nick}"
-@item(buffer_nicklist):button1-gesture-left = "/window ${_window_number};/kick ${nick}"
-@item(buffer_nicklist):button1-gesture-left-long = "/window ${_window_number};/kickban ${nick}"
-@item(buffer_nicklist):button2 = "/window ${_window_number};/whois ${nick}"
-@item(buffer_nicklist):button2-gesture-left = "/window ${_window_number};/ban ${nick}"
-@item(buflist):button1* = "hsignal:buflist_mouse"
-@item(buflist):button2* = "hsignal:buflist_mouse"
-@bar:wheeldown = "/bar scroll ${_bar_name} ${_window_number} +20%"
-@bar:wheelup = "/bar scroll ${_bar_name} ${_window_number} -20%"
-@chat:button1 = "/window ${_window_number}"
-@chat:button1-gesture-left = "/window ${_window_number};/buffer -1"
-@chat:button1-gesture-left-long = "/window ${_window_number};/buffer 1"
-@chat:button1-gesture-right = "/window ${_window_number};/buffer +1"
-@chat:button1-gesture-right-long = "/window ${_window_number};/input jump_last_buffer"
-@chat:ctrl-wheeldown = "/window scroll_horiz -window ${_window_number} +10%"
-@chat:ctrl-wheelup = "/window scroll_horiz -window ${_window_number} -10%"
-@chat:wheeldown = "/window scroll_down -window ${_window_number}"
-@chat:wheelup = "/window scroll_up -window ${_window_number}"
-@*:button3 = "/cursor go ${_x},${_y}"
diff --git a/.weechat/xfer.conf b/.weechat/xfer.conf
deleted file mode 100644
index c7ef6022..00000000
--- a/.weechat/xfer.conf
+++ /dev/null
@@ -1,46 +0,0 @@
-#
-# weechat -- xfer.conf
-#
-# WARNING: It is NOT recommended to edit this file by hand,
-# especially if WeeChat is running.
-#
-# Use /set or similar command to change settings in WeeChat.
-#
-# For more info, see: https://weechat.org/doc/quickstart
-#
-
-[look]
-auto_open_buffer = on
-progress_bar_size = 20
-pv_tags = "notify_private"
-
-[color]
-status_aborted = lightred
-status_active = lightblue
-status_connecting = yellow
-status_done = lightgreen
-status_failed = lightred
-status_waiting = lightcyan
-text = default
-text_bg = default
-text_selected = white
-
-[network]
-blocksize = 65536
-fast_send = on
-own_ip = ""
-port_range = ""
-speed_limit = 0
-timeout = 300
-
-[file]
-auto_accept_chats = off
-auto_accept_files = off
-auto_accept_nicks = ""
-auto_check_crc32 = off
-auto_rename = on
-auto_resume = on
-convert_spaces = on
-download_path = "%h/xfer"
-upload_path = "~"
-use_nick_in_filename = on