diff --git a/weechat/.weechat/python/apply_corrections.py b/weechat/.weechat/python/apply_corrections.py index 2fd8b5c..078fc1b 100644 --- a/weechat/.weechat/python/apply_corrections.py +++ b/weechat/.weechat/python/apply_corrections.py @@ -58,9 +58,14 @@ # History: # +# 2018-06-21, Chris Johnson : +# version 1.3: support python3 # 2014-05-10, Sébastien Helleu # version 1.2: change hook_print callback argument type of # displayed/highlight (WeeChat >= 1.0) +# 2013-06-24, Chris Johnson : +# version 1.2: declare SCRIPT_ variables before imports since one was being +# used there # 2012-10-09, Chris Johnson : # version 1.1: change some more variable names for clarity/consistency # 2012-10-08, Chris Johnson : @@ -91,6 +96,13 @@ # 2012-08-30, Chris Johnson : # version 0.1: initial release +SCRIPT_NAME = 'apply_corrections' +SCRIPT_AUTHOR = 'Chris Johnson ' +SCRIPT_VERSION = '1.3' +SCRIPT_LICENSE = 'GPL3' +SCRIPT_DESC = "When a correction (ex: s/typo/replacement) is sent, print the "\ + "user's previous message(s) with the corrected text instead." + import_ok = True try: @@ -106,16 +118,9 @@ try: from operator import itemgetter from collections import defaultdict except ImportError as message: - print('Missing package(s) for %s: %s' % (SCRIPT_NAME, message)) + print('Missing package(s) for {}: {}'.format(SCRIPT_NAME, message)) import_ok = False -SCRIPT_NAME = 'apply_corrections' -SCRIPT_AUTHOR = 'Chris Johnson ' -SCRIPT_VERSION = '1.2' -SCRIPT_LICENSE = 'GPL3' -SCRIPT_DESC = "When a correction (ex: s/typo/replacement) is sent, print the "\ - "user's previous message(s) with the corrected text instead." - # Default settings for the plugin. settings = {'check_every': '5', 'data_timeout': '60', @@ -158,7 +163,7 @@ def get_corrected_messages(nick, log, correction): original = message.get('message', '') if original: try: - match = re.match(re.compile('.*%s.*' % pattern), original) + match = re.match(re.compile('.*{}.*'.format(pattern)), original) except: match = original.find(pattern) != -1 finally: @@ -257,7 +262,7 @@ def handle_message_cb(data, buffer, date, tags, disp, hl, nick, message): valid_nick = r'([@~&!%+])?([-a-zA-Z0-9\[\]\\`_^\{|\}]+)' valid_correction = r's/[^/]*/[^/]*' correction_message_pattern = re.compile( - r'(%s:\s*)?(%s)(/)?$' % (valid_nick, valid_correction)) + r'({}:\s*)?({})(/)?$'.format(valid_nick, valid_correction)) match = re.match(correction_message_pattern, message) if match: @@ -269,8 +274,8 @@ def handle_message_cb(data, buffer, date, tags, disp, hl, nick, message): print_format = weechat.config_get_plugin('print_format') for cm in get_corrected_messages(nick, log, correction): corrected_msg = print_format - for k, v in cm.iteritems(): - corrected_msg = corrected_msg.replace('[%s]' % k, v) + for k, v in cm.items(): + corrected_msg = corrected_msg.replace('[{}]'.format(k), v) weechat.prnt_date_tags(buffer, 0, 'no_log', corrected_msg) else: # If it's not a correction, store the message in LASTWORDS. @@ -292,7 +297,7 @@ def load_config(data=None, option=None, value=None): # On initial load set any unset options to the defaults. if not option: - for option, default in settings.iteritems(): + for option, default in settings.items(): if not weechat.config_is_set_plugin(option): weechat.config_set_plugin(option, default) @@ -344,7 +349,7 @@ if __name__ == '__main__' and import_ok: desc_options() # Register hook to run load_config when options are changed. - weechat.hook_config('plugins.var.python.%s.*' % SCRIPT_NAME, + weechat.hook_config('plugins.var.python.{}.*'.format(SCRIPT_NAME), 'load_config', '') # Register hook_print to process each new message as it comes in. diff --git a/weechat/.weechat/python/autojoin.py b/weechat/.weechat/python/autojoin.py index 61449ff..f231307 100644 --- a/weechat/.weechat/python/autojoin.py +++ b/weechat/.weechat/python/autojoin.py @@ -46,6 +46,9 @@ # 2016-01-13, The fox in the shell # version 0.2.6: Support keeping chan list as secured data # +# 2018-08-09, Julien Palard +# version 0.3.0: Support for Python 3 + # @TODO: add options to ignore certain buffers # @TODO: maybe add an option to enable autosaving on part/join messages @@ -54,7 +57,7 @@ import re SCRIPT_NAME = "autojoin" SCRIPT_AUTHOR = "xt " -SCRIPT_VERSION = "0.2.6" +SCRIPT_VERSION = "0.3.0" SCRIPT_LICENSE = "GPL3" SCRIPT_DESC = "Configure autojoin for all servers according to currently joined channels" SCRIPT_COMMAND = "autojoin" @@ -91,7 +94,7 @@ def autosave_channels_on_quit(signal, callback, callback_data): items = find_channels() # print/execute commands - for server, channels in items.iteritems(): + for server, channels in items.items(): process_server(server, channels) return w.WEECHAT_RC_OK @@ -105,7 +108,7 @@ def autosave_channels_on_activity(signal, callback, callback_data): items = find_channels() # print/execute commands - for server, channels in items.iteritems(): + for server, channels in items.items(): nick = w.info_get('irc_nick', server) pattern = "^:%s!.*(JOIN|PART) :?(#[^ ]*)( :.*$)?" % nick @@ -130,7 +133,7 @@ def autojoin_cb(data, buffer, args): run = False # print/execute commands - for server, channels in items.iteritems(): + for server, channels in items.items(): process_server(server, channels, run) return w.WEECHAT_RC_OK diff --git a/weechat/.weechat/python/autoload/autosavekey.py b/weechat/.weechat/python/autoload/autosavekey.py new file mode 120000 index 0000000..fd537c7 --- /dev/null +++ b/weechat/.weechat/python/autoload/autosavekey.py @@ -0,0 +1 @@ +../autosavekey.py \ No newline at end of file diff --git a/weechat/.weechat/python/autosavekey.py b/weechat/.weechat/python/autosavekey.py new file mode 100644 index 0000000..2a3b0ad --- /dev/null +++ b/weechat/.weechat/python/autosavekey.py @@ -0,0 +1,263 @@ +# -*- coding: utf-8 -*- +# +# Copyright (c) 2013-2018 by nils_2 +# +# save channel key from protected channel(s) to autojoin or secure data +# +# 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 . +# +# idea by freenode.elsae +# +# 2018-05-11: nils_2, (freenode.#weechat) +# 0.4 : make script python3 compatible +# : add /help text +# +# 2015-05-09: nils_2, (freenode.#weechat) +# 0.3 : fix: ValueError (reported by: Darpa) +# +# 2014-12-20: nils_2, (freenode.#weechat) +# 0.2 : add option "add" to automatically add channel/key to autojoin option after a /join (idea by Prezident) +# +# 2013-10-03: nils_2, (freenode.#weechat) +# 0.1 : initial release +# +# requires: WeeChat version 0.3.2 +# +# Development is currently hosted at +# https://github.com/weechatter/weechat-scripts + +try: + import weechat,re + +except Exception: + print("This script must be run under WeeChat.") + print("Get WeeChat now at: http://www.weechat.org/") + quit() + +SCRIPT_NAME = "autosavekey" +SCRIPT_AUTHOR = "nils_2 " +SCRIPT_VERSION = "0.4" +SCRIPT_LICENSE = "GPL" +SCRIPT_DESC = "save channel key from protected channel(s) to autojoin option or secure data" + +OPTIONS = { 'mute' : ('off','execute command silently, only error messages will be displayed.'), + 'secure' : ('off','change channel key in secure data.'), + 'add' : ('off','adds channel and key to autojoin list on /join, if channel/key does not already exists'), + } +# /join #channel key +# signal = freenode,irc_raw_in_324 +# signal_data = :asimov.freenode.net 324 nick #channel +modes key +def irc_raw_in_324_cb(data, signal, signal_data): + parsed = get_hashtable(signal_data) + server = signal.split(',',1)[0] + argv = parsed['arguments'].split(" ") + + # buffer without channel key + if len(argv) < 4: + return weechat.WEECHAT_RC_OK + + channel = argv[1] + new_key = argv[3] + + autojoin_list = get_autojoin(server) + if not autojoin_list: + return weechat.WEECHAT_RC_OK + + # check autojoin for space + if len(re.findall(r" ", autojoin_list)) > 1: + weechat.prnt('', '%s%s: autojoin format for server "%s" invalid (two or more spaces).' % (weechat.prefix('error'),SCRIPT_NAME,server) ) + return weechat.WEECHAT_RC_OK + + # no keylist, only channels in autojoin option + if len(re.findall(r" ", autojoin_list)) == 0: + argv_channels = autojoin_list.split(',') + argv_keys = [] + else: + # split autojoin option to a channel and a key list + arg_channel,arg_keys = autojoin_list.split(' ') + argv_channels = arg_channel.split(',') + argv_keys = arg_keys.split(',') + + # check channel position + try: + channel_position = argv_channels.index(channel) + except ValueError: + channel_position = -1 + + sec_data = 0 + # does buffer already exist in autojoin list? + if channel_position >= 0: + # remove channel from list + argv_channels.pop(channel_position) + # check if there is at least one key in list + if len(argv_keys) >= 1: + # check channel position and number of keys + if channel_position <= len(argv_keys): + # remove key from list + sec_data = check_key_for_secure(argv_keys,channel_position) + sec_data_name = argv_keys[channel_position][11:-1] + argv_keys.pop(channel_position) + else: + if OPTIONS['add'].lower() == 'off': + return weechat.WEECHAT_RC_OK + + # add channel and key at first position + argv_channels.insert(0, channel) + argv_keys.insert(0,new_key) + + + # check weechat version and if secure option is on and secure data will be used for this key? + if int(version) >= 0x00040200 and OPTIONS['secure'].lower() == 'on' and sec_data == 1: + weechat.command('','%s/secure set %s %s' % (use_mute(),sec_data_name,new_key)) + else: + if sec_data == 1: + weechat.prnt('', '%s%s: key for channel "%s.%s" not changed! option "plugins.var.python.%s.secure" is off and you are using secured data for key.' % (weechat.prefix('error'),SCRIPT_NAME,server,channel,SCRIPT_NAME) ) + return weechat.WEECHAT_RC_OK + new_joined_option = '%s %s' % (','.join(argv_channels),','.join(argv_keys)) + save_autojoin_option(server,new_joined_option) + return weechat.WEECHAT_RC_OK + +# replace an already existing channel key with an new one +# when OP changes channel key +def irc_raw_in_mode_cb(data, signal, signal_data): + parsed = get_hashtable(signal_data) + + server = signal.split(',',1)[0] + argv = parsed['arguments'].split(" ") + + if argv[1] != "+k": + return weechat.WEECHAT_RC_OK + + channel = argv[0] + new_key = argv[2] + + add_key_to_list(server,channel,new_key) + return weechat.WEECHAT_RC_OK + +def add_key_to_list(server,channel,new_key): + autojoin_list = get_autojoin(server) + if not autojoin_list: + return weechat.WEECHAT_RC_OK + + # check autojoin for space + if len(re.findall(r" ", autojoin_list)) == 0: + weechat.prnt('', '%s%s: no password(s) set in autojoin for server "%s".' % (weechat.prefix('error'),SCRIPT_NAME,server) ) + return weechat.WEECHAT_RC_OK + if len(re.findall(r" ", autojoin_list)) > 1: + weechat.prnt('', '%s%s: autojoin format for server "%s" invalid (two or more spaces).' % (weechat.prefix('error'),SCRIPT_NAME,server) ) + return weechat.WEECHAT_RC_OK + + + # split autojoin option to a channel and a key list + arg_channel,arg_keys = autojoin_list.split(' ') + argv_channels = arg_channel.split(',') + argv_keys = arg_keys.split(',') + + # search for channel name in list of channels and get position + if channel in argv_channels: + channel_pos_in_list = argv_channels.index(channel) + # enough keys in list? list counts from 0! + if channel_pos_in_list + 1 > len(argv_keys): + weechat.prnt('', '%s%s: not enough keys in list or channel position is not valid. check out autojoin option for server "%s".' % (weechat.prefix('error'),SCRIPT_NAME,server) ) + return weechat.WEECHAT_RC_OK + + sec_data = check_key_for_secure(argv_keys,channel_pos_in_list) + + # check weechat version and if secure option is on and secure data will be used for this key? + if int(version) >= 0x00040200 and OPTIONS['secure'].lower() == 'on' and sec_data == 1: + sec_data_name = argv_keys[channel_pos_in_list][11:-1] + weechat.command('','%s/secure set %s %s' % (use_mute(),sec_data_name,new_key)) + else: + if sec_data == 1: + weechat.prnt('', '%s%s: key for channel "%s.%s" not changed! option "plugins.var.python.%s.secure" is off and you are using secured data for key.' % (weechat.prefix('error'),SCRIPT_NAME,server,channel,SCRIPT_NAME) ) + return weechat.WEECHAT_RC_OK + argv_keys[channel_pos_in_list] = new_key + new_joined_option = '%s %s' % (','.join(argv_channels),','.join(argv_keys)) + save_autojoin_option(server,new_joined_option) + return weechat.WEECHAT_RC_OK + +def get_hashtable(string): + parsed = weechat.info_get_hashtable('irc_message_parse', dict(message=string)) + try: + parsed['message'] = parsed['arguments'].split(' :', 1)[1] + except: + parsed['message'] = "" + return parsed + +def get_autojoin(server): + return weechat.config_string(weechat.config_get('irc.server.%s.autojoin' % server)) + +def find_element_in_list(element,list_element): + try: + index_element=list_element.index(element) + return index_element + except ValueError: + return -1 + +def save_autojoin_option(server,new_joined_option): + weechat.command('','%s/set irc.server.%s.autojoin %s' % (use_mute(),server,new_joined_option)) + +def use_mute(): + use_mute = '' + if OPTIONS['mute'].lower() == 'on': + use_mute = '/mute ' + return use_mute + +# check key for "${sec.data." +def check_key_for_secure(argv_keys,position): + sec_data = 0 + if argv_keys[position][0:11] == '${sec.data.': + sec_data = 1 + return sec_data + +def cmd_autosavekey(data, buffer, args): + weechat.command('', '/help %s' % SCRIPT_NAME) + return weechat.WEECHAT_RC_OK + +# ================================[ weechat options & description ]=============================== +def init_options(): + for option,value in OPTIONS.items(): + if not weechat.config_is_set_plugin(option): + weechat.config_set_plugin(option, value[0]) + OPTIONS[option] = value[0] + else: + OPTIONS[option] = weechat.config_get_plugin(option) + weechat.config_set_desc_plugin(option, '%s (default: "%s")' % (value[1], value[0])) + +def toggle_refresh(pointer, name, value): + global OPTIONS + option = name[len('plugins.var.python.' + SCRIPT_NAME + '.'):] # get optionname + OPTIONS[option] = value # save new value + return weechat.WEECHAT_RC_OK + +# ================================[ main ]=============================== +if __name__ == "__main__": + if weechat.register(SCRIPT_NAME, SCRIPT_AUTHOR, SCRIPT_VERSION, SCRIPT_LICENSE, SCRIPT_DESC, '', ''): + weechat.hook_command(SCRIPT_NAME,SCRIPT_DESC, + '', + 'You have to edit options with: /set *autosavekey*\n' + 'I suggest using /iset script or /fset plugin.\n', + '', + 'cmd_autosavekey', + '') + version = weechat.info_get("version_number", "") or 0 + + if int(version) >= 0x00030200: + init_options() + weechat.hook_config( 'plugins.var.python.' + SCRIPT_NAME + '.*', 'toggle_refresh', '' ) + weechat.hook_signal("*,irc_raw_in_mode","irc_raw_in_mode_cb","") + weechat.hook_signal("*,irc_raw_in_324","irc_raw_in_324_cb","") + else: + weechat.prnt("","%s%s %s" % (weechat.prefix("error"),SCRIPT_NAME,": needs version 0.3.2 or higher")) + weechat.command("","/wait 1ms /python unload %s" % SCRIPT_NAME)