From 28f79026679b3daac75fddce654596cb69628815 Mon Sep 17 00:00:00 2001 From: Sebastien Helleu Date: Wed, 20 Sep 2006 09:45:07 +0000 Subject: Added keepnick python script --- scripts/python/keepnick.py | 204 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 204 insertions(+) create mode 100644 scripts/python/keepnick.py (limited to 'scripts') diff --git a/scripts/python/keepnick.py b/scripts/python/keepnick.py new file mode 100644 index 000000000..7f8c4e024 --- /dev/null +++ b/scripts/python/keepnick.py @@ -0,0 +1,204 @@ +# -*- encoding: iso-8859-1 -*- +# +# Copyright (c) 2006 by EgS +# +# 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 2 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, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +# + + +####################################################################### +# # +# This script enables the user to keep their nicks and recover it in # +# case it get's stolen. It uses the servers prefered nicks, so there # +# is no need for any kind of setup. # +# # +# Name: Keepnick # +# Licence: GPL v2 # +# Author: Marcus Eggenberger # +# # +# Usage: # +# /keepnick on|off| # +# # +# use /help command for detailed information # +# # +# Changelog: # +# 0.4: now starts on load and features user defined check intervals # +# 0.3: Fixed major bug with continuous nickchanges # +# 0.2: Fixed Bug: now only checks connected servers # +# 0.1: first version released # +# # +####################################################################### + +# ==================== +# Imports +# ==================== +import sys + +# ==================== +# Constants +# ==================== +NAME = 'Keepnick' +VERSION = '0.4' +DESCRIPTION = "Plugin to keep your nick and recover it in case it's stolen" + +ISON = '/ison %s' +NICK = '/nick %s' + +NICKSTEALER_LEFT = "Nickstealer left Network: %s!" +KEEPNICK_ARG_ERROR = "\"%s\" is not a valid argument to /keepnick" +KEEPNICK_ON = "Keepnick locked and loaded! (checking every %s seconds)" +KEEPNICK_OFF = "Keepnick offline!" + +DELAY = 10 + +# ==================== +# Exceptions +# ==================== + +# ==================== +# Helpers +# ==================== +class WeePrint(object): + def write(self, text): + text = text.rstrip(' \0\n') # strip the null byte appended by pythons print + if text: + weechat.prnt(text,'') + +def registerFunction(function): + # Register a python function as a commandhandler + # Function needs to be named like weeFunction and + # is bound to /function + # docstring is used for weechat help + functionname = function.__name__ # guess what :) + weecommand = functionname[3:].lower() # strip the wee + + doc = function.__doc__.splitlines() + arguments = doc[0] # First docstring line is the arguments string + description = doc[1][4:] + args_description = '\n'.join([line[4:] for line in doc[2:-1]]) # join rest and strip indentation + + if not function.func_defaults: # use args default value as template + template = '' + elif len(function.func_defaults) == 1: + template = function.func_defaults[0] + elif len(function.func_defaults) == 2: + template = func.func_defaults[1] + + weechat.add_command_handler(weecommand, functionname, description, arguments, args_description, template) + +def registerFunctions(): + functions = [function for name, function in globals().iteritems() if name.startswith('wee') and callable(function)] + for func in functions: + registerFunction(func) + +# ==================== +# Functions +# ==================== +def servernicks(servername): + server = weechat.get_server_info()[servername] + servernicks = [server['nick1'], server['nick2'], server['nick3']] + return servernicks + +def ison(server, nicklist): + weechat.command(ISON % ' '.join(nicklist), "", server) + +def gotnick(server): + server = weechat.get_server_info()[server] + return server['nick'].lower() == server['nick1'].lower() + +def checknicks(): + for servername, server in weechat.get_server_info().iteritems(): + if not gotnick(servername) and server['ssl_connected'] + server['is_connected']: + ison(servername, servernicks(servername)) + return weechat.PLUGIN_RC_OK + +def grabnick(server, nick): + if not gotnick(server): + print NICKSTEALER_LEFT % server + weechat.command(NICK % nick, '', server) + +def isonhandler(server, args): + nothing, message, nicks = args.split(':') + nicks = [nick.lower() for nick in nicks.split()] + for nick in servernicks(server): + if nick.lower() == weechat.get_info("nick",server): + return weechat.PLUGIN_RC_OK_IGNORE_ALL + elif nick.lower() not in nicks: + grabnick(server, nick) + return weechat.PLUGIN_RC_OK_IGNORE_ALL + + if 0 in [nick.lower() in [mynick.lower() for mynick in servernicks(server)] for nick in nicks]: + # if any nick wich is return by ison is not on our checklist we're not the caller + return weechat.PLUGIN_RC_OK + else: + # seems like we're the caller -> ignore the output + return weechat.PLUGIN_RC_OK_IGNORE_ALL + +def weeKeepnick(server, args="ON|OFF"): + """ON|OFF| + Enables or Disables the use of keepnick. + When active Keepnick ensures that you keep your preferred nicks. + Keepnick checks for the preferred nicks of each server config, + so there is no need to configure anything. Using a number as the + argument it sets the checkperiod to that number in seconds. + + Example: + /keepnick ON + """ + VALIDARGS = ['ON','OFF'] + + weechat.remove_handler('303', "isonhandler") + weechat.remove_timer_handler("checknicks") + + try: + delay = int(args) + if delay < 1: + raise ValueError + globals()['DELAY'] = delay + except ValueError: + if args.upper() not in VALIDARGS: + print KEEPNICK_ARG_ERROR % args + return weechat.PLUGIN_RC_OK + + if args.upper() != 'OFF': + weechat.add_timer_handler(DELAY,"checknicks") + weechat.add_message_handler('303', "isonhandler") + print KEEPNICK_ON % DELAY + else: + print KEEPNICK_OFF + + return weechat.PLUGIN_RC_OK + +# ==================== +# Let's Register! +# ==================== +if __name__ == '__main__': + try: + import weechat + except ImportError: + print "This script is to be loaded as PythonScript in WeeChat" + print "Get WeeChat now at: http://weechat.flashtux.org/" + import sys + sys.exit(10) + + # kick pythons print to weechat.prnt(msg, '') + sys.stdout = WeePrint() + weechat.register(NAME, VERSION, "", DESCRIPTION) + registerFunctions() + weeKeepnick('','ON') + + + + -- cgit v1.2.3