From cb48912db6d3dec473d73f1cfa3754547034896f Mon Sep 17 00:00:00 2001 From: James Vega Date: Sun, 3 Oct 2010 14:58:38 -0400 Subject: [PATCH 001/412] Services: Correct formatting of "isn't registered" log. Closes: Sf#3075937 Signed-off-by: James Vega --- plugins/Services/plugin.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/Services/plugin.py b/plugins/Services/plugin.py index e5882573b..1d17a8085 100644 --- a/plugins/Services/plugin.py +++ b/plugins/Services/plugin.py @@ -244,7 +244,7 @@ class Services(callbacks.Plugin): # You have been unbanned from (oftc) irc.sendMsg(networkGroup.channels.join(channel)) elif 'isn\'t registered' in s: - self.log.warning('Received "%s isn\'t registered" from ChanServ %', + self.log.warning('Received "%s isn\'t registered" from ChanServ %s', channel, on) elif 'this channel has been registered' in s: self.log.debug('Got "Registered channel" from ChanServ %s.', on) From 543e78828b258fe764017e95ebdd30d39fd74555 Mon Sep 17 00:00:00 2001 From: James Vega Date: Mon, 6 Jun 2011 21:44:15 -0400 Subject: [PATCH 002/412] Add utils.net.isIPV4, with utils.net.isIP checking v4 or v6 Signed-off-by: James Vega --- src/conf.py | 4 ++-- src/ircutils.py | 7 ++++--- src/utils/net.py | 20 ++++++++++++++++---- test/test_utils.py | 6 ++---- 4 files changed, 24 insertions(+), 13 deletions(-) diff --git a/src/conf.py b/src/conf.py index b00b495c4..efc87aadd 100644 --- a/src/conf.py +++ b/src/conf.py @@ -1,6 +1,6 @@ ### # Copyright (c) 2002-2005, Jeremiah Fincher -# Copyright (c) 2008-2009, James Vega +# Copyright (c) 2008-2009,2011, James Vega # All rights reserved. # # Redistribution and use in source and binary forms, with or without @@ -1031,7 +1031,7 @@ registerGlobalValue(supybot, 'defaultIgnore', class IP(registry.String): """Value must be a valid IP.""" def setValue(self, v): - if v and not (utils.net.isIP(v) or utils.net.isIPV6(v)): + if v and not utils.net.isIP(v): self.error() else: registry.String.setValue(self, v) diff --git a/src/ircutils.py b/src/ircutils.py index 815259060..7cfa70568 100644 --- a/src/ircutils.py +++ b/src/ircutils.py @@ -1,5 +1,6 @@ ### # Copyright (c) 2002-2005, Jeremiah Fincher +# Copyright (c) 2011, James Vega # All rights reserved. # # Redistribution and use in source and binary forms, with or without @@ -190,7 +191,7 @@ def banmask(hostmask): """ assert isUserHostmask(hostmask) host = hostFromHostmask(hostmask) - if utils.net.isIP(host): + if utils.net.isIPV4(host): L = host.split('.') L[-1] = '*' return '*!*@' + '.'.join(L) @@ -461,8 +462,8 @@ def replyTo(msg): return msg.nick def dccIP(ip): - """Returns in IP in the proper for DCC.""" - assert utils.net.isIP(ip), \ + """Returns an IP in the proper for DCC.""" + assert utils.net.isIPV4(ip), \ 'argument must be a string ip in xxx.yyy.zzz.www format.' i = 0 x = 256**3 diff --git a/src/utils/net.py b/src/utils/net.py index fa78fdcc3..ffe8c2005 100644 --- a/src/utils/net.py +++ b/src/utils/net.py @@ -1,5 +1,6 @@ ### # Copyright (c) 2002-2005, Jeremiah Fincher +# Copyright (c) 2011, James Vega # All rights reserved. # # Redistribution and use in source and binary forms, with or without @@ -44,7 +45,7 @@ def getSocket(host): """ addrinfo = socket.getaddrinfo(host, None) host = addrinfo[0][4][0] - if isIP(host): + if isIPV4(host): return socket.socket(socket.AF_INET, socket.SOCK_STREAM) elif isIPV6(host): return socket.socket(socket.AF_INET6, socket.SOCK_STREAM) @@ -52,16 +53,27 @@ def getSocket(host): raise socket.error, 'Something wonky happened.' def isIP(s): - """Returns whether or not a given string is an IPV4 address. + """Returns whether or not a given string is an IP address. >>> isIP('255.255.255.255') 1 - >>> isIP('abc.abc.abc.abc') + >>> isIP('::1') + 0 + """ + return isIPV4(s) or isIPV6(s) + +def isIPV4(s): + """Returns whether or not a given string is an IPV4 address. + + >>> isIPV4('255.255.255.255') + 1 + + >>> isIPV4('abc.abc.abc.abc') 0 """ try: - return bool(socket.inet_aton(s)) + return bool(socket.inet_pton(socket.AF_INET, s)) except socket.error: return False diff --git a/test/test_utils.py b/test/test_utils.py index c61132181..82d8efb3f 100644 --- a/test/test_utils.py +++ b/test/test_utils.py @@ -1,6 +1,6 @@ ### # Copyright (c) 2002-2005, Jeremiah Fincher -# Copyright (c) 2009, James Vega +# Copyright (c) 2009,2011, James Vega # All rights reserved. # # Redistribution and use in source and binary forms, with or without @@ -510,11 +510,9 @@ class NetTest(SupyTestCase): isIP = utils.net.isIP self.failIf(isIP('a.b.c')) self.failIf(isIP('256.0.0.0')) - self.failUnless(isIP('127.1')) self.failUnless(isIP('0.0.0.0')) self.failUnless(isIP('100.100.100.100')) - # This test is too flaky to bother with. - # self.failUnless(utils.isIP('255.255.255.255')) + self.failUnless(isIP('255.255.255.255')) def testIsIPV6(self): f = utils.net.isIPV6 From d56381436c3dc9e574384a3c935ecf18fbb024f7 Mon Sep 17 00:00:00 2001 From: James Vega Date: Mon, 6 Jun 2011 22:28:35 -0400 Subject: [PATCH 003/412] Update Internet.dns to handle IPv6 IPs and responses Signed-off-by: James Vega --- plugins/Internet/plugin.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/plugins/Internet/plugin.py b/plugins/Internet/plugin.py index 490c9165c..eb5354394 100644 --- a/plugins/Internet/plugin.py +++ b/plugins/Internet/plugin.py @@ -1,6 +1,6 @@ ### # Copyright (c) 2003-2005, Jeremiah Fincher -# Copyright (c) 2010, James Vega +# Copyright (c) 2010-2011, James Vega # All rights reserved. # # Redistribution and use in source and binary forms, with or without @@ -53,7 +53,7 @@ class Internet(callbacks.Plugin): irc.reply(hostname) else: try: - ip = socket.gethostbyname(host) + ip = socket.getaddrinfo(host, None)[0][4][0] if ip == '64.94.110.11': # Verisign sucks! irc.reply('Host not found.') else: From b0e595fbd2e9b244738f4f8b1b5b88831583ad03 Mon Sep 17 00:00:00 2001 From: James Vega Date: Mon, 6 Jun 2011 22:29:21 -0400 Subject: [PATCH 004/412] Update Internet.hexip to handle IPv6 Signed-off-by: James Vega --- plugins/Internet/plugin.py | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/plugins/Internet/plugin.py b/plugins/Internet/plugin.py index eb5354394..de94afcd9 100644 --- a/plugins/Internet/plugin.py +++ b/plugins/Internet/plugin.py @@ -149,12 +149,22 @@ class Internet(callbacks.Plugin): Returns the hexadecimal IP for that IP. """ - quads = ip.split('.') ret = "" - for quad in quads: - i = int(quad) - ret += '%02x' % i - irc.reply(ret.upper()) + if utils.net.isIPV4(ip): + quads = ip.split('.') + for quad in quads: + i = int(quad) + ret += '%02X' % i + else: + octets = ip.split(':') + for octet in octets: + if octet: + i = int(octet, 16) + ret += '%04X' % i + else: + missing = (8 - len(octets)) * 4 + ret += '0' * missing + irc.reply(ret) hexip = wrap(hexip, ['ip']) From 0cd4939678e5839c85b57460c7c4b000c8fc1751 Mon Sep 17 00:00:00 2001 From: James Vega Date: Tue, 2 Aug 2011 22:19:47 -0400 Subject: [PATCH 005/412] Seen: Anchor nick regexp to ensure valid match. When searching for 'st*ke', 'stryker' would incorrectly match, 'stryke' would be added to the nick set and the subsequent lookup would cause a KeyError. This is fixed both by anchoring the regexp ('^st.*ke$' instead of 'st.*ke') and adding searchNick to the nick set instead of the string that matched the pattern. Closes: Sf#3377381 Signed-off-by: James Vega --- plugins/Seen/plugin.py | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/plugins/Seen/plugin.py b/plugins/Seen/plugin.py index d5bc6275e..c4255b172 100644 --- a/plugins/Seen/plugin.py +++ b/plugins/Seen/plugin.py @@ -1,6 +1,6 @@ ### # Copyright (c) 2002-2004, Jeremiah Fincher -# Copyright (c) 2010, James Vega +# Copyright (c) 2010-2011, James Vega # All rights reserved. # # Redistribution and use in source and binary forms, with or without @@ -66,7 +66,7 @@ class SeenDB(plugins.ChannelUserDB): def seenWildcard(self, channel, nick): nicks = ircutils.IrcSet() - nickRe = re.compile('.*'.join(nick.split('*')), re.I) + nickRe = re.compile('^%s$' % '.*'.join(nick.split('*')), re.I) for (searchChan, searchNick) in self.keys(): #print 'chan: %s ... nick: %s' % (searchChan, searchNick) if isinstance(searchNick, int): @@ -75,11 +75,8 @@ class SeenDB(plugins.ChannelUserDB): # are keyed by nick-string continue if ircutils.strEqual(searchChan, channel): - try: - s = nickRe.match(searchNick).group() - except AttributeError: - continue - nicks.add(s) + if nickRe.search(searchNick) is not None: + nicks.add(searchNick) L = [[nick, self.seen(channel, nick)] for nick in nicks] def negativeTime(x): return -x[1][0] From 4661acb3a3e1f6bd5773ead9aa290995cfc2bfa4 Mon Sep 17 00:00:00 2001 From: James Vega Date: Mon, 22 Aug 2011 14:07:39 -0400 Subject: [PATCH 006/412] Honor supybot-test's timeout option and document the units Signed-off-by: James Vega --- scripts/supybot-test | 6 ++++-- src/test.py | 5 ++++- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/scripts/supybot-test b/scripts/supybot-test index 2bec1826e..c0a500713 100644 --- a/scripts/supybot-test +++ b/scripts/supybot-test @@ -2,6 +2,7 @@ ### # Copyright (c) 2002-2005, Jeremiah Fincher +# Copyright (c) 2011, James Vega # All rights reserved. # # Redistribution and use in source and binary forms, with or without @@ -122,9 +123,10 @@ if __name__ == '__main__': parser.add_option('-c', '--clean', action='store_true', default=False, dest='clean', help='Cleans the various data/conf/logs' 'directories before running tests.') - parser.add_option('-t', '--timeout', action='store', type='int', + parser.add_option('-t', '--timeout', action='store', type='float', dest='timeout', - help='Sets the timeout for tests to return responses.') + help='Sets the timeout, in seconds, for tests to return ' + 'responses.') parser.add_option('-v', '--verbose', action='store_true', default=False, help='Sets the verbose flag, logging extra information ' 'about each test that runs.') diff --git a/src/test.py b/src/test.py index f0e2826df..7a3280bbe 100644 --- a/src/test.py +++ b/src/test.py @@ -1,5 +1,6 @@ ### # Copyright (c) 2002-2005, Jeremiah Fincher +# Copyright (c) 2011, James Vega # All rights reserved. # # Redistribution and use in source and binary forms, with or without @@ -54,6 +55,8 @@ network = True # This is the global list of suites that are to be run. suites = [] +timeout = 10 + originalCallbacksGetHelp = callbacks.getHelp lastGetHelp = 'x'*1000 def cachingGetHelp(method, name=None, doc=None): @@ -110,12 +113,12 @@ class PluginTestCase(SupyTestCase): """Subclass this to write a test case for a plugin. See plugins/Plugin/test.py for an example. """ - timeout = 10 plugins = None cleanConfDir = True cleanDataDir = True config = {} def __init__(self, methodName='runTest'): + self.timeout = timeout originalRunTest = getattr(self, methodName) def runTest(self): run = True From 5ada9193b9443e6665c443de3fdeb0b24f74cfdd Mon Sep 17 00:00:00 2001 From: James Vega Date: Mon, 22 Aug 2011 14:07:39 -0400 Subject: [PATCH 007/412] Honor supybot-test's timeout option and document the units Signed-off-by: James Vega --- scripts/supybot-test | 6 ++++-- src/test.py | 5 ++++- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/scripts/supybot-test b/scripts/supybot-test index 2bec1826e..c0a500713 100644 --- a/scripts/supybot-test +++ b/scripts/supybot-test @@ -2,6 +2,7 @@ ### # Copyright (c) 2002-2005, Jeremiah Fincher +# Copyright (c) 2011, James Vega # All rights reserved. # # Redistribution and use in source and binary forms, with or without @@ -122,9 +123,10 @@ if __name__ == '__main__': parser.add_option('-c', '--clean', action='store_true', default=False, dest='clean', help='Cleans the various data/conf/logs' 'directories before running tests.') - parser.add_option('-t', '--timeout', action='store', type='int', + parser.add_option('-t', '--timeout', action='store', type='float', dest='timeout', - help='Sets the timeout for tests to return responses.') + help='Sets the timeout, in seconds, for tests to return ' + 'responses.') parser.add_option('-v', '--verbose', action='store_true', default=False, help='Sets the verbose flag, logging extra information ' 'about each test that runs.') diff --git a/src/test.py b/src/test.py index f5722f093..d7e167270 100644 --- a/src/test.py +++ b/src/test.py @@ -1,5 +1,6 @@ ### # Copyright (c) 2002-2005, Jeremiah Fincher +# Copyright (c) 2011, James Vega # All rights reserved. # # Redistribution and use in source and binary forms, with or without @@ -60,6 +61,8 @@ network = True # This is the global list of suites that are to be run. suites = [] +timeout = 10 + originalCallbacksGetHelp = callbacks.getHelp lastGetHelp = 'x' * 1000 def cachingGetHelp(method, name=None, doc=None): @@ -116,12 +119,12 @@ class PluginTestCase(SupyTestCase): """Subclass this to write a test case for a plugin. See plugins/Plugin/test.py for an example. """ - timeout = 10 plugins = None cleanConfDir = True cleanDataDir = True config = {} def __init__(self, methodName='runTest'): + self.timeout = timeout originalRunTest = getattr(self, methodName) def runTest(self): run = True From e98ac0f4c2c3c0fa6ae451a6a288471d1b6cc8f8 Mon Sep 17 00:00:00 2001 From: Daniel Folkinshteyn Date: Thu, 5 Aug 2010 13:45:02 -0400 Subject: [PATCH 008/412] Some improvements to the commands.process function - better process naming and informational output. Conflicts: plugins/String/plugin.py src/commands.py --- src/callbacks.py | 8 ++++---- src/version.py | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/callbacks.py b/src/callbacks.py index 7944981c5..4f5846285 100644 --- a/src/callbacks.py +++ b/src/callbacks.py @@ -993,11 +993,11 @@ class CommandProcess(world.SupyProcess): to run in processes. """ def __init__(self, target=None, args=(), kwargs={}): - self.command = args[0] - self.cb = target.im_self + pn = kwargs.pop('pn', 'Unknown') + cn = kwargs.pop('cn', 'unknown') procName = 'Process #%s (for %s.%s)' % (world.processesSpawned, - self.cb.name(), - self.command) + pn, + cn) log.debug('Spawning process %s (args: %r)', procName, args) self.__parent = super(CommandProcess, self) self.__parent.__init__(target=target, name=procName, diff --git a/src/version.py b/src/version.py index 798922f0a..9f6542864 100644 --- a/src/version.py +++ b/src/version.py @@ -1,3 +1,3 @@ """stick the various versioning attributes in here, so we only have to change them once.""" -version = '0.83.4.1+limnoria (2011-08-23T16:41:52+0200)' +version = '0.83.4.1+limnoria (2011-08-25T11:36:47+0200)' From 08a28214b856d7a3c3587337e30eb46384918743 Mon Sep 17 00:00:00 2001 From: Valentin Lorentz Date: Fri, 26 Aug 2011 17:16:13 +0200 Subject: [PATCH 009/412] RSS: bug fix. (Bad import from gribble?) --- plugins/RSS/plugin.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/plugins/RSS/plugin.py b/plugins/RSS/plugin.py index 53a1ca2b7..15acb4b83 100644 --- a/plugins/RSS/plugin.py +++ b/plugins/RSS/plugin.py @@ -198,15 +198,19 @@ class RSS(callbacks.Plugin): v = False break return v - for channel in channels: + fnor channel in channels: if len(oldheadlines) == 0: channelnewheadlines = newheadlines[:self.registryValue('initialAnnounceHeadlines', channel)] + else: + channelnewheadlines = newheadlines[:] whitelist = self.registryValue('keywordWhitelist', channel) blacklist = self.registryValue('keywordBlacklist', channel) if len(whitelist) != 0: channelnewheadlines = filter(filter_whitelist, channelnewheadlines) if len(blacklist) != 0: channelnewheadlines = filter(filter_blacklist, channelnewheadlines) + if len(channelnewheadlines) == 0: + return bold = self.registryValue('bold', channel) sep = self.registryValue('headlineSeparator', channel) prefix = self.registryValue('announcementPrefix', channel) From dda08e06482ea2d1df07124a889d31a027cf0b9e Mon Sep 17 00:00:00 2001 From: Valentin Lorentz Date: Sat, 27 Aug 2011 13:58:14 +0000 Subject: [PATCH 010/412] RSS: Fix typo (fnor -> for). --- plugins/RSS/plugin.py | 2 +- src/version.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/plugins/RSS/plugin.py b/plugins/RSS/plugin.py index 15acb4b83..fecc57ef3 100644 --- a/plugins/RSS/plugin.py +++ b/plugins/RSS/plugin.py @@ -198,7 +198,7 @@ class RSS(callbacks.Plugin): v = False break return v - fnor channel in channels: + for channel in channels: if len(oldheadlines) == 0: channelnewheadlines = newheadlines[:self.registryValue('initialAnnounceHeadlines', channel)] else: diff --git a/src/version.py b/src/version.py index 9f6542864..75b20297d 100644 --- a/src/version.py +++ b/src/version.py @@ -1,3 +1,3 @@ """stick the various versioning attributes in here, so we only have to change them once.""" -version = '0.83.4.1+limnoria (2011-08-25T11:36:47+0200)' +version = '0.83.4.1+limnoria (2011-08-27T13:58:14+0000)' From 2a3fc2a0f3177d72b2053b3ec2173107c3873d6f Mon Sep 17 00:00:00 2001 From: skizzhg Date: Tue, 30 Aug 2011 17:21:39 +0000 Subject: [PATCH 011/412] ChannelStats: Add l10n-it. --- plugins/ChannelStats/locale/it.po | 186 ++++++++++++++++++++++++++++++ src/version.py | 2 +- 2 files changed, 187 insertions(+), 1 deletion(-) create mode 100644 plugins/ChannelStats/locale/it.po diff --git a/plugins/ChannelStats/locale/it.po b/plugins/ChannelStats/locale/it.po new file mode 100644 index 000000000..f240f470d --- /dev/null +++ b/plugins/ChannelStats/locale/it.po @@ -0,0 +1,186 @@ +msgid "" +msgstr "" +"Project-Id-Version: Supybot-fr\n" +"POT-Creation-Date: 2011-02-26 09:49+CET\n" +"PO-Revision-Date: 2011-07-05 13:41+0200\n" +"Last-Translator: skizzhg \n" +"Language-Team: Italian \n" +"Language: it\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + + +#: config.py:60 +msgid "" +"Determines whether the bot will keep channel\n" +" statistics on itself, possibly skewing the channel stats (especially in\n" +" cases where the bot is relaying between channels on a network)." +msgstr "" +"Determina se il bot terrà statistiche del canale, probabilmente alterandole\n" +" (in particolare in caso faccia l'inoltro dei messaggi attraverso i canali).\n" + +#: config.py:64 +msgid "" +"Determines what\n" +" words (i.e., pieces of text with no spaces in them) are considered\n" +" 'smileys' for the purposes of stats-keeping." +msgstr "" +"Determina quali parole (ovvero parti di testo senza spazi) sono considerate\n" +" faccine sorridenti per le statistiche." + +#: config.py:68 +msgid "" +"Determines what words\n" +" (i.e., pieces of text with no spaces in them ) are considered 'frowns' for\n" +" the purposes of stats-keeping." +msgstr "" +"Determina quali parole (ovvero parti di testo senza spazi) sono considerate\n" +" faccine tristi per le statistiche." + +#: plugin.py:246 +#, docstring +msgid "" +"[] []\n" +"\n" +" Returns the statistics for on . is only\n" +" necessary if the message isn't sent on the channel itself. If \n" +" isn't given, it defaults to the user sending the command.\n" +" " +msgstr "" +"[] []\n" +"\n" +" Riporta le statistiche per su . è necessario\n" +" solo se il messaggio non viene inviato nel canale stesso. Se \n" +" non è specificato, passa all'utente che ha dato il comando.\n" +" " + +#: plugin.py:259 +msgid "I couldn't find you in my user database." +msgstr "Non ti trovo nel mio database utenti." + +#: plugin.py:272 +msgid "%s has sent %n; a total of %n, %n, %n, and %n; %s of those messages %s. %s has joined %n, parted %n, quit %n, kicked someone %n, been kicked %n, changed the topic %n, and changed the mode %n." +msgstr "%s ha inviato %n; un totale di %n, %n, %n, e %n; %s di quei messaggi %s. %s è entrato %n volte, è uscito %n volte, si è disconnesso %n volte, ha espulso qualcuno %n volte, è stato espulso %n volte, ha modificato il topic %n volte ed ha cambiato il mode %n volte." + +#: plugin.py:279 +msgid "character" +msgstr "carattere" + +#: plugin.py:280 plugin.py:363 +msgid "word" +msgstr "parola" + +#: plugin.py:281 plugin.py:364 +msgid "smiley" +msgstr "faccina sorridente" + +#: plugin.py:282 plugin.py:365 +msgid "frown" +msgstr "faccina triste" + +#: plugin.py:284 plugin.py:366 +msgid "was an ACTION" +msgstr "è stata un'azione (ACTION)" + +#: plugin.py:285 plugin.py:367 +msgid "were ACTIONs" +msgstr "sono state azioni (ACTION)" + +#: plugin.py:287 plugin.py:288 plugin.py:289 plugin.py:290 plugin.py:291 +#: plugin.py:292 plugin.py:293 +msgid "time" +msgstr "volta" + +#: plugin.py:296 +msgid "I have no stats for that %s in %s." +msgstr "Non ho statistiche per %s in %s." + +#: plugin.py:304 +#, docstring +msgid "" +"[] \n" +"\n" +" Returns the ranking of users according to the given stat expression.\n" +" Valid variables in the stat expression include 'msgs', 'chars',\n" +" 'words', 'smileys', 'frowns', 'actions', 'joins', 'parts', 'quits',\n" +" 'kicks', 'kicked', 'topics', and 'modes'. Any simple mathematical\n" +" expression involving those variables is permitted.\n" +" " +msgstr "" +"[] \n" +"\n" +" Riporta la classifica degli utenti in base all'espresisone fornita.\n" +" Le variabili valide sono: \"msgs\", \"chars\", \"words\", \"smileys\",\n" +" \"frowns\", \"actions\", \"joins\", \"parts\", \"quits\", \kicks\",\n" +" \"kicked\", \"topics\" e \"modes\". È permessa qualsiasi espressione\n" +" matematica che utilizzi queste variabili.\n" +" " + +#: plugin.py:315 +msgid "There's really no reason why you should have underscores or brackets in your mathematical expression. Please remove them." +msgstr "Non v'è alcuna ragione di usare underscore o parentesi nelle espressioni matematiche; ti invito a rimuoverli." + +#: plugin.py:319 +msgid "You can't use lambda in this command." +msgstr "Non è possibile usare lambda in questo comando." + +#: plugin.py:333 +msgid "stat variable" +msgstr "variabile di statistica" + +#: plugin.py:349 +#, docstring +msgid "" +"[]\n" +"\n" +" Returns the statistics for . is only necessary if\n" +" the message isn't sent on the channel itself.\n" +" " +msgstr "" +"[]\n" +"\n" +" Riporta le statistiche di . è necessario\n" +" solo se il messaggio non viene inviato nel canale stesso.\n" +" " + +#: plugin.py:357 +msgid "On %s there %h been %i messages, containing %i characters, %n, %n, and %n; %i of those messages %s. There have been %n, %n, %n, %n, %n, and %n. There %b currently %n and the channel has peaked at %n." +msgstr "In %s ci sono stati %i messaggi, contenenti %i caratteri, %n, %n, e %n; %i di questi messaggi %s. Ci sono stati %n, %n, %n, %n, %n, e %n. Attualmente ci %b %n e il canale ha raggiunto il picco di %n." + +#: plugin.py:368 +msgid "join" +msgstr "join" + +#: plugin.py:369 +msgid "part" +msgstr "part" + +#: plugin.py:370 +msgid "quit" +msgstr "quit" + +#: plugin.py:371 +msgid "kick" +msgstr "kick" + +#: plugin.py:372 +msgid "mode" +msgstr "mode" + +#: plugin.py:372 plugin.py:373 +msgid "change" +msgstr "modifiche" + +#: plugin.py:373 +msgid "topic" +msgstr "topic" + +#: plugin.py:375 plugin.py:376 +msgid "user" +msgstr "utente" + +#: plugin.py:379 +msgid "I've never been on %s." +msgstr "Non sono mai stato su %s." + diff --git a/src/version.py b/src/version.py index 75b20297d..0c1c0fda6 100644 --- a/src/version.py +++ b/src/version.py @@ -1,3 +1,3 @@ """stick the various versioning attributes in here, so we only have to change them once.""" -version = '0.83.4.1+limnoria (2011-08-27T13:58:14+0000)' +version = '0.83.4.1+limnoria (2011-08-30T17:21:39+0000)' From af65f64c1ac02172db7e2c659c236124482ad490 Mon Sep 17 00:00:00 2001 From: Valentin Lorentz Date: Thu, 1 Sep 2011 11:10:31 +0200 Subject: [PATCH 012/412] PluginDownloader: Fix overwrite of existing plugin. --- plugins/PluginDownloader/plugin.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/plugins/PluginDownloader/plugin.py b/plugins/PluginDownloader/plugin.py index fbfe2c6f2..5b8b690eb 100644 --- a/plugins/PluginDownloader/plugin.py +++ b/plugins/PluginDownloader/plugin.py @@ -30,6 +30,7 @@ import os import json +import shutil import urllib import urllib2 import tarfile @@ -153,7 +154,7 @@ class GithubRepository(GitRepository): newFileName = os.path.join(directory, newFileName) if os.path.exists(newFileName): assert os.path.isdir(newFileName) - shutils.rmtree(newFileName) + shutil.rmtree(newFileName) if extractedFile is None: os.mkdir(newFileName) else: @@ -260,6 +261,7 @@ class PluginDownloader(callbacks.Plugin): repositories[repository].install(plugin) irc.replySuccess() except Exception as e: + raise e #FIXME: more detailed error message log.error(str(e)) irc.error('The plugin could not be installed.') From caa20fb10afe44e781a621f82e4c40e68b378bea Mon Sep 17 00:00:00 2001 From: Mika Suomalainen Date: Thu, 1 Sep 2011 18:56:27 +0300 Subject: [PATCH 013/412] Added push.sh to gitignore --- .gitignore | 1 + push.sh | 4 ++++ 2 files changed, 5 insertions(+) create mode 100644 push.sh diff --git a/.gitignore b/.gitignore index 0eb42244e..fa633cca2 100644 --- a/.gitignore +++ b/.gitignore @@ -10,3 +10,4 @@ docs/plugins *.swo *~ *.mo +push.sh diff --git a/push.sh b/push.sh new file mode 100644 index 000000000..23c6bf17c --- /dev/null +++ b/push.sh @@ -0,0 +1,4 @@ +#!/bin/bash +git fetch --all +git push origin --all +git push mirror --mirror From 9d6c9c63cd039487787f58b5e26badc3100187c8 Mon Sep 17 00:00:00 2001 From: Mika Suomalainen Date: Thu, 1 Sep 2011 18:57:34 +0300 Subject: [PATCH 014/412] Removed push.sh from the repo. I put it there by accident. --- push.sh | 4 ---- 1 file changed, 4 deletions(-) delete mode 100644 push.sh diff --git a/push.sh b/push.sh deleted file mode 100644 index 23c6bf17c..000000000 --- a/push.sh +++ /dev/null @@ -1,4 +0,0 @@ -#!/bin/bash -git fetch --all -git push origin --all -git push mirror --mirror From 46e16d798e8cf362b6c874bab7562b8e7df23a58 Mon Sep 17 00:00:00 2001 From: Mika Suomalainen Date: Thu, 1 Sep 2011 19:00:39 +0300 Subject: [PATCH 015/412] Added merge.sh to gitignore --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index fa633cca2..9939c273b 100644 --- a/.gitignore +++ b/.gitignore @@ -11,3 +11,4 @@ docs/plugins *~ *.mo push.sh +merge.sh From f273687c5eed69013f6abb9caa592437281710bc Mon Sep 17 00:00:00 2001 From: nyuszika7h Date: Thu, 1 Sep 2011 18:21:11 +0200 Subject: [PATCH 016/412] Limiter: Add l10n-hu. --- plugins/Limiter/locale/hu.po | 49 ++++++++++++++++++++++++++++++++++++ 1 file changed, 49 insertions(+) create mode 100644 plugins/Limiter/locale/hu.po diff --git a/plugins/Limiter/locale/hu.po b/plugins/Limiter/locale/hu.po new file mode 100644 index 000000000..2c0b99365 --- /dev/null +++ b/plugins/Limiter/locale/hu.po @@ -0,0 +1,49 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR ORGANIZATION +# FIRST AUTHOR , YEAR. +# +msgid "" +msgstr "" +"Project-Id-Version: Limnoria Limiter\n" +"POT-Creation-Date: 2011-02-26 09:49+CET\n" +"PO-Revision-Date: 2011-09-01 18:12+0200\n" +"Last-Translator: nyuszika7h \n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: pygettext.py 1.5\n" + + +#: config.py:46 +msgid "" +"Determines whether the bot will maintain the\n" +" channel limit to be slightly above the current number of people in the\n" +" channel, in order to make clone/drone attacks harder." +msgstr "Meghatározza, hogy a bot tartsa-e a csatorna korlátját kicsivel a jelenlegi emberek számával a csatornában, hogy a klóntámadásokat nehezebbé tegye." + +#: config.py:50 +msgid "" +"Determines the minimum number of free\n" +" spots that will be saved when limits are being enforced. This should\n" +" always be smaller than supybot.plugins.Limiter.limit.maximumExcess." +msgstr "Meghatározza a szabad helyek minimum számát, amelyek meg lesznek mentve amikor a korlátok kényszerítve vannak. Ennek mindig kisebbnek kell lennie a supybot.plugins.Limiter.limit.maximumExcess-nél." + +#: config.py:54 +msgid "" +"Determines the maximum number of free spots\n" +" that will be saved when limits are being enforced. This should always be\n" +" larger than supybot.plugins.Limiter.limit.minimumExcess." +msgstr "Meghatározza a szabad helyek maximum számát, amelyek meg lesznek mentve amikor a korlátok kényszerítve vannak. Ennek mindig nagyobbnak kell lennie a supybot.plugins.Limiter.limit.minimumExcess-nél." + +#: plugin.py:39 +#, docstring +msgid "" +"In order to use this plugin, its config values need to be properly\n" +" setup. supybot.plugins.Limiter.enable needs to be set to True and\n" +" supybot.plugins.Limiter.{maximumExcess,minimumExcess} should be set to\n" +" values appropriate to your channel (if the defaults aren't satisfactory).\n" +" Once these are set, and someone enters/leaves the channel, Supybot will\n" +" start setting the proper +l modes.\n" +" " +msgstr "A bővítmény használatához a konfigurációs értékeinek rendesen be kell lenniük állítva. A supybot.plugins.Limiter.enable True-ra kell, hogy legyen állítva, és a supybot.plugins.Limiter.{maximumExcess,minimumExcess}-nek a csatornának megfelelő értékekre kell lenniük állítva (ha az alapértelmezés nem kielégítő). Ahogy ezek be vannak állítva, és valaki be-/kilép a csatornáról/-ba, a Supybot elkezdi beállítani a megfelelő +l módokat." From 2f6acdf42f0d4b34f49a6259e4e34bd1f6cbc3e1 Mon Sep 17 00:00:00 2001 From: Valentin Lorentz Date: Thu, 1 Sep 2011 17:48:09 +0000 Subject: [PATCH 017/412] Misc: Add --unloaded option. --- plugins/Misc/config.py | 5 +++ plugins/Misc/plugin.py | 72 +++++++++++++++++++++++++++++++++--------- plugins/Misc/test.py | 6 ++++ src/version.py | 2 +- 4 files changed, 69 insertions(+), 16 deletions(-) diff --git a/plugins/Misc/config.py b/plugins/Misc/config.py index f1c4dc19e..873661212 100644 --- a/plugins/Misc/config.py +++ b/plugins/Misc/config.py @@ -46,6 +46,11 @@ conf.registerGlobalValue(Misc, 'listPrivatePlugins', plugins with the list command if given the --private switch. If this is disabled, non-owner users should be unable to see what private plugins are loaded."""))) +conf.registerGlobalValue(Misc, 'listUnloadedPlugins', + registry.Boolean(True, _("""Determines whether the bot will list unloaded + plugins with the list command if given the --unloaded switch. If this is + disabled, non-owner users should be unable to see what unloaded plugins + are available."""))) conf.registerGlobalValue(Misc, 'timestampFormat', registry.String('[%H:%M:%S]', _("""Determines the format string for timestamps in the Misc.last command. Refer to the Python documentation diff --git a/plugins/Misc/plugin.py b/plugins/Misc/plugin.py index 2f20de0a0..7b7a03487 100644 --- a/plugins/Misc/plugin.py +++ b/plugins/Misc/plugin.py @@ -30,6 +30,7 @@ import re import os +import imp import sys import time @@ -49,6 +50,23 @@ from supybot.utils.iter import ifilter from supybot.i18n import PluginInternationalization, internationalizeDocstring _ = PluginInternationalization('Misc') +def get_suffix(file): + for suffix in imp.get_suffixes(): + if file[-len(suffix[0]):] == suffix[0]: + return suffix + return None + +def getPluginsInDirectory(directory): + # get modules in a given directory + plugins = [] + for filename in os.listdir(directory): + pluginPath = os.path.join(directory, filename) + if os.path.isdir(pluginPath): + if all(os.path.isfile(os.path.join(pluginPath, x)) + for x in ['__init__.py', 'config.py', 'plugin.py']): + plugins.append(filename) + return plugins + class RegexpTimeout(Exception): pass @@ -121,34 +139,57 @@ class Misc(callbacks.Plugin): @internationalizeDocstring def list(self, irc, msg, args, optlist, cb): - """[--private] [] + """[--private] [--unloaded] [] Lists the commands available in the given plugin. If no plugin is given, lists the public plugins available. If --private is given, - lists the private plugins. + lists the private plugins. If --unloaded is given, it will list + available plugins that are not loaded. """ private = False + unloaded = False for (option, argument) in optlist: if option == 'private': private = True if not self.registryValue('listPrivatePlugins') and \ not ircdb.checkCapability(msg.prefix, 'owner'): irc.errorNoCapability('owner') + elif option == 'unloaded': + unloaded = True + if not self.registryValue('listUnloadedPlugins') and \ + not ircdb.checkCapability(msg.prefix, 'owner'): + irc.errorNoCapability('owner') + if unloaded and private: + irc.error(_('--private and --unloaded are uncompatible options.')) + return if not cb: - def isPublic(cb): - name = cb.name() - return conf.supybot.plugins.get(name).public() - names = [cb.name() for cb in irc.callbacks - if (private and not isPublic(cb)) or - (not private and isPublic(cb))] - names.sort() - if names: - irc.reply(format('%L', names)) + if unloaded: + installedPluginsDirectory = os.path.join( + os.path.dirname(__file__), '..') + plugins = getPluginsInDirectory(installedPluginsDirectory) + for directory in conf.supybot.directories.plugins()[:]: + plugins.extend(getPluginsInDirectory(directory)) + # Remove loaded plugins: + loadedPlugins = [x.name() for x in irc.callbacks] + plugins = [x for x in plugins if x not in loadedPlugins] + + plugins.sort() + irc.reply(format('%L', plugins)) else: - if private: - irc.reply(_('There are no private plugins.')) + def isPublic(cb): + name = cb.name() + return conf.supybot.plugins.get(name).public() + names = [cb.name() for cb in irc.callbacks + if (private and not isPublic(cb)) or + (not private and isPublic(cb))] + names.sort() + if names: + irc.reply(format('%L', names)) else: - irc.reply(_('There are no public plugins.')) + if private: + irc.reply(_('There are no private plugins.')) + else: + irc.reply(_('There are no public plugins.')) else: commands = cb.listCommands() if commands: @@ -162,7 +203,8 @@ class Misc(callbacks.Plugin): 'Try "config list supybot.plugins.%s" to see ' 'what configuration variables it has.'), cb.name())) - list = wrap(list, [getopts({'private':''}), additional('plugin')]) + list = wrap(list, [getopts({'private':'', 'unloaded':''}), + additional('plugin')]) @internationalizeDocstring def apropos(self, irc, msg, args, s): diff --git a/plugins/Misc/test.py b/plugins/Misc/test.py index bf7948dbd..7105d9414 100644 --- a/plugins/Misc/test.py +++ b/plugins/Misc/test.py @@ -114,6 +114,12 @@ class MiscTestCase(ChannelPluginTestCase): self.assertRegexp('list', name) self.assertNotRegexp('list --private', name) + def testListUnloaded(self): + unloadedPlugin = 'Alias' + loadedPlugin = 'Anonymous' + self.assertRegexp('list --unloaded', 'Alias') + self.assertNotRegexp('list --unloaded', 'Anonymous') + def testListDoesNotIncludeNonCanonicalName(self): self.assertNotRegexp('list Owner', '_exec') diff --git a/src/version.py b/src/version.py index 0c1c0fda6..65819247d 100644 --- a/src/version.py +++ b/src/version.py @@ -1,3 +1,3 @@ """stick the various versioning attributes in here, so we only have to change them once.""" -version = '0.83.4.1+limnoria (2011-08-30T17:21:39+0000)' +version = '0.83.4.1+limnoria (2011-09-01T17:48:08+0000)' From 151c6a0738e9b58a39d36680cdd93567da0d418b Mon Sep 17 00:00:00 2001 From: skizzhg Date: Fri, 2 Sep 2011 20:03:45 +0000 Subject: [PATCH 018/412] ChannelStats: Update l10n-it. --- plugins/ChannelStats/locale/it.po | 4 ++-- src/version.py | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/plugins/ChannelStats/locale/it.po b/plugins/ChannelStats/locale/it.po index f240f470d..cec04fe44 100644 --- a/plugins/ChannelStats/locale/it.po +++ b/plugins/ChannelStats/locale/it.po @@ -112,7 +112,7 @@ msgstr "" "\n" " Riporta la classifica degli utenti in base all'espresisone fornita.\n" " Le variabili valide sono: \"msgs\", \"chars\", \"words\", \"smileys\",\n" -" \"frowns\", \"actions\", \"joins\", \"parts\", \"quits\", \kicks\",\n" +" \"frowns\", \"actions\", \"joins\", \"parts\", \"quits\", \"kicks\",\n" " \"kicked\", \"topics\" e \"modes\". È permessa qualsiasi espressione\n" " matematica che utilizzi queste variabili.\n" " " @@ -146,7 +146,7 @@ msgstr "" #: plugin.py:357 msgid "On %s there %h been %i messages, containing %i characters, %n, %n, and %n; %i of those messages %s. There have been %n, %n, %n, %n, %n, and %n. There %b currently %n and the channel has peaked at %n." -msgstr "In %s ci sono stati %i messaggi, contenenti %i caratteri, %n, %n, e %n; %i di questi messaggi %s. Ci sono stati %n, %n, %n, %n, %n, e %n. Attualmente ci %b %n e il canale ha raggiunto il picco di %n." +msgstr "In %s ci sono%v stati %i messaggi, contenenti %i caratteri, %n, %n, e %n; %i di questi messaggi %s. Ci sono stati %n, %n, %n, %n, %n, e %n. Attualmente ci sono%v %n e il canale ha raggiunto il picco di %n." #: plugin.py:368 msgid "join" diff --git a/src/version.py b/src/version.py index 65819247d..f90183d52 100644 --- a/src/version.py +++ b/src/version.py @@ -1,3 +1,3 @@ """stick the various versioning attributes in here, so we only have to change them once.""" -version = '0.83.4.1+limnoria (2011-09-01T17:48:08+0000)' +version = '0.83.4.1+limnoria (2011-09-02T20:03:44+0000)' From 904503e67efa169de0f404014cf0a83a4feae152 Mon Sep 17 00:00:00 2001 From: Valentin Lorentz Date: Sun, 11 Sep 2011 16:43:21 +0200 Subject: [PATCH 019/412] Ctcp: Update CTCP-Source reply. Closes GH-203. --- plugins/Ctcp/plugin.py | 2 +- src/version.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/plugins/Ctcp/plugin.py b/plugins/Ctcp/plugin.py index 94dc3e2ed..57cca6c1f 100644 --- a/plugins/Ctcp/plugin.py +++ b/plugins/Ctcp/plugin.py @@ -107,7 +107,7 @@ class Ctcp(callbacks.PluginRegexp): "\x01SOURCE\x01" self.log.info('Received CTCP SOURCE from %s', msg.prefix) self._reply(irc, msg, - 'SOURCE http://www.sourceforge.net/projects/supybot/') + 'SOURCE https://github.com/ProgVal/Limnoria') def doNotice(self, irc, msg): if ircmsgs.isCtcp(msg): diff --git a/src/version.py b/src/version.py index f90183d52..2c2fb49c3 100644 --- a/src/version.py +++ b/src/version.py @@ -1,3 +1,3 @@ """stick the various versioning attributes in here, so we only have to change them once.""" -version = '0.83.4.1+limnoria (2011-09-02T20:03:44+0000)' +version = '0.83.4.1+limnoria (2011-09-11T16:43:21+0200)' From 2a958cd8e98ea42418fb36901eb79884dc5b5f5e Mon Sep 17 00:00:00 2001 From: Tannn3r Date: Sun, 11 Sep 2011 21:01:13 +0300 Subject: [PATCH 020/412] Karma: added README. --- plugins/Karma/README.txt | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/plugins/Karma/README.txt b/plugins/Karma/README.txt index d60b47a97..922af9197 100644 --- a/plugins/Karma/README.txt +++ b/plugins/Karma/README.txt @@ -1 +1,7 @@ -Insert a description of your plugin here, with any notes, etc. about using it. +This will increase or decrease karma for the item. + +If "config plugins.karma.allowUnaddressedKarma" is set to true, saying "boats++" will give 1 karma to "boats", and "ships--" will subtract 1 karma from "ships". + +However, if you use this in a sentence, like "That deserves a ++. Kevin++", 1 karma will be added to "That deserves a ++. Kevin", so you should only add or subtract karma in a line that doesn't have anything else in it. + +If "config plugins.karma.allowUnaddressedKarma" is set to false, you must use "botname: bots++" to add or subtract karma. From b80d6b27d60af1e584d24874d9d7b59632c5f393 Mon Sep 17 00:00:00 2001 From: Valentin Lorentz Date: Sun, 11 Sep 2011 20:13:20 +0200 Subject: [PATCH 021/412] Karma: Fix SQLite threading issue. Closes GH-206. --- plugins/Karma/plugin.py | 4 ++-- src/version.py | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/plugins/Karma/plugin.py b/plugins/Karma/plugin.py index 375770619..91cdad38c 100644 --- a/plugins/Karma/plugin.py +++ b/plugins/Karma/plugin.py @@ -60,11 +60,11 @@ class SqliteKarmaDB(object): if filename in self.dbs: return self.dbs[filename] if os.path.exists(filename): - db = sqlite3.connect(filename) + db = sqlite3.connect(filename, check_same_thread=False) db.text_factory = str self.dbs[filename] = db return db - db = sqlite3.connect(filename) + db = sqlite3.connect(filename, check_same_thread=False) db.text_factory = str self.dbs[filename] = db cursor = db.cursor() diff --git a/src/version.py b/src/version.py index 2c2fb49c3..edae166ae 100644 --- a/src/version.py +++ b/src/version.py @@ -1,3 +1,3 @@ """stick the various versioning attributes in here, so we only have to change them once.""" -version = '0.83.4.1+limnoria (2011-09-11T16:43:21+0200)' +version = '0.83.4.1+limnoria (2011-09-11T20:13:20+0200)' From 4463da24f67bbca01a079d351a5d9e6dd597da5f Mon Sep 17 00:00:00 2001 From: Tannn3r Date: Sun, 11 Sep 2011 19:37:41 -0500 Subject: [PATCH 022/412] Added a description on how to use the Lart plugin. --- plugins/Lart/README.txt | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/plugins/Lart/README.txt b/plugins/Lart/README.txt index d60b47a97..f59b09c36 100644 --- a/plugins/Lart/README.txt +++ b/plugins/Lart/README.txt @@ -1 +1,5 @@ -Insert a description of your plugin here, with any notes, etc. about using it. +Allows the use of the Luser Attitude Readjustment Tool on someone or something. +Example: +If you add 'slaps $who'. +Someone says '@lart ChanServ'. +* bot slaps ChanServ \ No newline at end of file From c2af09ff9d55b5e466911be948d7db39cca877b2 Mon Sep 17 00:00:00 2001 From: Tannn3r Date: Sun, 11 Sep 2011 19:54:19 -0500 Subject: [PATCH 023/412] Added a description of the plugin. --- plugins/Limiter/README.txt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/plugins/Limiter/README.txt b/plugins/Limiter/README.txt index d60b47a97..2cefb4c75 100644 --- a/plugins/Limiter/README.txt +++ b/plugins/Limiter/README.txt @@ -1 +1,2 @@ -Insert a description of your plugin here, with any notes, etc. about using it. +This will set a limit on the channel based on plugins.Limiter.MaximumExcess plus the current number of users in the channel. +This is useful to prevent flood attacks. \ No newline at end of file From aad9f566f3ce4cecfa2ebd7670dfd629f38c99a8 Mon Sep 17 00:00:00 2001 From: Tannn3r Date: Sun, 11 Sep 2011 19:57:30 -0500 Subject: [PATCH 024/412] Added a description. --- plugins/Math/README.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/Math/README.txt b/plugins/Math/README.txt index d60b47a97..648405224 100644 --- a/plugins/Math/README.txt +++ b/plugins/Math/README.txt @@ -1 +1 @@ -Insert a description of your plugin here, with any notes, etc. about using it. +This plugin provides a calculator, converter, a listo of units and other useful math functions. From 2a16ebea06fe5a611ca3da93ce9b518071626744 Mon Sep 17 00:00:00 2001 From: Tannn3r Date: Sun, 11 Sep 2011 19:59:26 -0500 Subject: [PATCH 025/412] Added a description. --- plugins/NickCapture/README.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/NickCapture/README.txt b/plugins/NickCapture/README.txt index d60b47a97..5388aad1a 100644 --- a/plugins/NickCapture/README.txt +++ b/plugins/NickCapture/README.txt @@ -1 +1 @@ -Insert a description of your plugin here, with any notes, etc. about using it. +This allows the bot to regain access to it's configured nick. From 953149f11fdc64814faf855dbb7012c4e5fa1f15 Mon Sep 17 00:00:00 2001 From: Tannn3r Date: Sun, 11 Sep 2011 20:02:24 -0500 Subject: [PATCH 026/412] Added a description. --- plugins/Network/README.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/Network/README.txt b/plugins/Network/README.txt index d60b47a97..539a607a0 100644 --- a/plugins/Network/README.txt +++ b/plugins/Network/README.txt @@ -1 +1 @@ -Insert a description of your plugin here, with any notes, etc. about using it. +Allows connecting, reconnecting, display the bot's latency between the server and other useful network-related commands. \ No newline at end of file From baa966a1b704341638523cdd652aef8d6873994e Mon Sep 17 00:00:00 2001 From: Tannn3r Date: Sun, 11 Sep 2011 20:04:23 -0500 Subject: [PATCH 027/412] Added a description. --- plugins/Nickometer/README.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/Nickometer/README.txt b/plugins/Nickometer/README.txt index d60b47a97..7f0636016 100644 --- a/plugins/Nickometer/README.txt +++ b/plugins/Nickometer/README.txt @@ -1 +1 @@ -Insert a description of your plugin here, with any notes, etc. about using it. +Will tell you how lame a nick is by the command '@nickometer [nick]'. \ No newline at end of file From d9a9c64fa4ac57507d645a3f1ac29d1d6c1812e6 Mon Sep 17 00:00:00 2001 From: Tannn3r Date: Sun, 11 Sep 2011 20:06:05 -0500 Subject: [PATCH 028/412] Added a description. --- plugins/Note/README.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/Note/README.txt b/plugins/Note/README.txt index d60b47a97..85131f832 100644 --- a/plugins/Note/README.txt +++ b/plugins/Note/README.txt @@ -1 +1 @@ -Insert a description of your plugin here, with any notes, etc. about using it. +Allows you to send notes to other users. \ No newline at end of file From a0a39d0503cdb30933183863544c2569eae63cb7 Mon Sep 17 00:00:00 2001 From: Tannn3r Date: Sun, 11 Sep 2011 20:08:43 -0500 Subject: [PATCH 029/412] Added a description. --- plugins/Plugin/README.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/Plugin/README.txt b/plugins/Plugin/README.txt index d60b47a97..4b715f86e 100644 --- a/plugins/Plugin/README.txt +++ b/plugins/Plugin/README.txt @@ -1 +1 @@ -Insert a description of your plugin here, with any notes, etc. about using it. +This plugin allows you to see the plugins, which plugin a command belongs to, you can find out who the author of the command is and who contributed to it. \ No newline at end of file From 46f6314fb4dcfd5e408b3cdfe1cd7612c722d06d Mon Sep 17 00:00:00 2001 From: Tannn3r Date: Sun, 11 Sep 2011 20:09:49 -0500 Subject: [PATCH 030/412] Added a description. --- plugins/PluginDownloader/README.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/PluginDownloader/README.txt b/plugins/PluginDownloader/README.txt index d60b47a97..d667ae887 100644 --- a/plugins/PluginDownloader/README.txt +++ b/plugins/PluginDownloader/README.txt @@ -1 +1 @@ -Insert a description of your plugin here, with any notes, etc. about using it. +This plugin allows you to quickly download and install a plugin from other repositories. \ No newline at end of file From 7ccd1474cda83d48c75b61edbc120f6d626e4557 Mon Sep 17 00:00:00 2001 From: Tannn3r Date: Sun, 11 Sep 2011 20:11:28 -0500 Subject: [PATCH 031/412] Added a description. --- plugins/Praise/README.txt | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/plugins/Praise/README.txt b/plugins/Praise/README.txt index d60b47a97..e9871d84f 100644 --- a/plugins/Praise/README.txt +++ b/plugins/Praise/README.txt @@ -1 +1,5 @@ -Insert a description of your plugin here, with any notes, etc. about using it. +Allows someone to praise someone or something. +Example: +If you add 'hugs $who'. +Someone says '@praise ChanServ'. +* bot hugs ChanServ \ No newline at end of file From ca2d73bee5ad2d9e7a364c4c3d368d79b4fa98a6 Mon Sep 17 00:00:00 2001 From: Tannn3r Date: Sun, 11 Sep 2011 20:16:46 -0500 Subject: [PATCH 032/412] Added a description. --- plugins/Quote/README.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/Quote/README.txt b/plugins/Quote/README.txt index d60b47a97..8f7d29d68 100644 --- a/plugins/Quote/README.txt +++ b/plugins/Quote/README.txt @@ -1 +1 @@ -Insert a description of your plugin here, with any notes, etc. about using it. +This plugin allows you to add quotes to the database for the channel. \ No newline at end of file From cac8d57525ae8809d40c113b7b5c840354d25d5e Mon Sep 17 00:00:00 2001 From: Tanner Date: Mon, 12 Sep 2011 17:21:40 -0500 Subject: [PATCH 033/412] URL: Added a description to READEME.txt --- plugins/URL/README.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/URL/README.txt b/plugins/URL/README.txt index d60b47a97..ce19e9609 100644 --- a/plugins/URL/README.txt +++ b/plugins/URL/README.txt @@ -1 +1 @@ -Insert a description of your plugin here, with any notes, etc. about using it. +This plugin records how many URLs have been mentioned in the channel and what the last URL was. \ No newline at end of file From ef62a1bd76d280614e64fd481fa6cc142f081e7e Mon Sep 17 00:00:00 2001 From: Tanner Date: Mon, 12 Sep 2011 17:23:21 -0500 Subject: [PATCH 034/412] Relay: Added a description to READEME.txt --- plugins/Relay/README.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/Relay/README.txt b/plugins/Relay/README.txt index d60b47a97..7687f9361 100644 --- a/plugins/Relay/README.txt +++ b/plugins/Relay/README.txt @@ -1 +1 @@ -Insert a description of your plugin here, with any notes, etc. about using it. +This plugin allows you to setup a relay between networks. \ No newline at end of file From bb9f904bcc567d2edc34eba3fe5b54b2ef83d320 Mon Sep 17 00:00:00 2001 From: Tanner Date: Mon, 12 Sep 2011 17:26:02 -0500 Subject: [PATCH 035/412] Reply: Added a description to README.txt --- plugins/Reply/README.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/Reply/README.txt b/plugins/Reply/README.txt index d60b47a97..575685cd1 100644 --- a/plugins/Reply/README.txt +++ b/plugins/Reply/README.txt @@ -1 +1 @@ -Insert a description of your plugin here, with any notes, etc. about using it. +This plugin allows you to use different reply commands. \ No newline at end of file From a2e5c18f4b0e28429d15c5214b797213709de05d Mon Sep 17 00:00:00 2001 From: Tanner Date: Mon, 12 Sep 2011 17:30:42 -0500 Subject: [PATCH 036/412] ShrinkURL: Added a description to README.txt --- plugins/ShrinkUrl/README.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/ShrinkUrl/README.txt b/plugins/ShrinkUrl/README.txt index d60b47a97..f961ba203 100644 --- a/plugins/ShrinkUrl/README.txt +++ b/plugins/ShrinkUrl/README.txt @@ -1 +1 @@ -Insert a description of your plugin here, with any notes, etc. about using it. +This plugin features commands to shorten URLs through different services. \ No newline at end of file From 3a1241179626b477d10fc14f881b210bfbe1ecbc Mon Sep 17 00:00:00 2001 From: Tanner Date: Mon, 12 Sep 2011 17:33:14 -0500 Subject: [PATCH 037/412] Status: Added a description to README.txt --- plugins/Status/README.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/Status/README.txt b/plugins/Status/README.txt index d60b47a97..2605b89ca 100644 --- a/plugins/Status/README.txt +++ b/plugins/Status/README.txt @@ -1 +1 @@ -Insert a description of your plugin here, with any notes, etc. about using it. +This plugin allows you to view different bot statistics, for example, uptime. \ No newline at end of file From e0625fa8a117c30802ba1209505dd9db95d51cb4 Mon Sep 17 00:00:00 2001 From: Tanner Date: Mon, 12 Sep 2011 17:34:14 -0500 Subject: [PATCH 038/412] Time: Added a description to README.txt --- plugins/Time/README.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/Time/README.txt b/plugins/Time/README.txt index d60b47a97..8b505a45c 100644 --- a/plugins/Time/README.txt +++ b/plugins/Time/README.txt @@ -1 +1 @@ -Insert a description of your plugin here, with any notes, etc. about using it. +This plugin allows you to use different time functions. \ No newline at end of file From dcaefbdcf588cc2bae6f45f727168ffef49a93a5 Mon Sep 17 00:00:00 2001 From: nyuszika7h Date: Tue, 13 Sep 2011 11:07:52 +0200 Subject: [PATCH 039/412] Add SASL support to core. --- src/conf.py | 11 ++++++++++- src/irclib.py | 26 ++++++++++++++++++++++++++ 2 files changed, 36 insertions(+), 1 deletion(-) diff --git a/src/conf.py b/src/conf.py index f38dfba33..fb90e17b1 100644 --- a/src/conf.py +++ b/src/conf.py @@ -258,7 +258,7 @@ class SpaceSeparatedSetOfChannels(registry.SpaceSeparatedListOf): else: return ircmsgs.join(channel) -def registerNetwork(name, password='', ssl=False): +def registerNetwork(name, username='', password='', ssl=False): network = registerGroup(supybot.networks, name) registerGlobalValue(network, 'password', registry.String(password, _("""Determines what password will be used on %s. Yes, we know that @@ -277,6 +277,15 @@ def registerNetwork(name, password='', ssl=False): registerChannelValue(network.channels, 'key', registry.String('', _("""Determines what key (if any) will be used to join the channel."""))) + sasl = registerGroup(network, 'sasl') + registerGlobalValue(sasl, 'username', registry.String(username, + _("""Determines what SASL username will be used on %s. This should + be the bot's account name. Due to the way SASL works, you can't use + any grouped nick.""") % name, private=False)) + registerGlobalValue(sasl, 'password', registry.String(password, + _("""Determines what SASL password will be used on %s. Yes, we know + that technically passwords are server-specific and not network-specific, + but this is the best we can do right now.""") % name, private=True)) return network # Let's fill our networks. diff --git a/src/irclib.py b/src/irclib.py index 0efa1abc8..b7dc0f648 100644 --- a/src/irclib.py +++ b/src/irclib.py @@ -31,6 +31,7 @@ import re import copy import time import random +import base64 import supybot.log as log import supybot.conf as conf @@ -862,6 +863,8 @@ class Irc(IrcCommandDispatcher): self.ident = conf.supybot.ident() self.alternateNicks = conf.supybot.nick.alternates()[:] self.password = conf.supybot.networks.get(self.network).password() + self.sasl_username = conf.supybot.networks.get(self.network).sasl.username() + self.sasl_password = conf.supybot.networks.get(self.network).sasl.password() self.prefix = '%s!%s@%s' % (self.nick, self.ident, 'unset.domain') # The rest. self.lastTake = 0 @@ -875,6 +878,18 @@ class Irc(IrcCommandDispatcher): self.driver.die() self._reallyDie() else: + if self.sasl_password: + if not self.sasl_username: + log.error('SASL username is not set, unable to identify.') + else: + auth_string = base64.b64encode('%s\x00%s\x00%s' % (self.sasl_username, + self.sasl_username, self.sasl_password)) + log.debug('Sending CAP REQ command, requesting capability \'sasl\'.') + self.queueMsg(ircmsgs.IrcMsg(command="CAP", args=('REQ', 'sasl'))) + log.debug('Sending AUTHENTICATE command, using mechanism PLAIN.') + self.queueMsg(ircmsgs.IrcMsg(command="AUTHENTICATE", args=('PLAIN',))) + log.info('Sending AUTHENTICATE command, not logging the password.') + self.queueMsg(ircmsgs.IrcMsg(command="AUTHENTICATE", args=(auth_string,))) if self.password: log.info('Sending PASS command, not logging the password.') self.queueMsg(ircmsgs.password(self.password)) @@ -884,6 +899,17 @@ class Irc(IrcCommandDispatcher): self.ident, self.user) self.queueMsg(ircmsgs.user(self.ident, self.user)) + def do903(self, msg): + log.info('SASL authentication successful') + log.debug('Sending CAP END command.') + self.queueMsg(ircmsgs.IrcMsg(command="CAP", args=('END',))) + + def do904(self, msg): + log.warning('SASL authentication failed') + log.debug('Aborting authentication.') + log.debug('Sending CAP END command.') + self.queueMsg(ircmsgs.IrcMsg(command="CAP", args=('END',))) + def _getNextNick(self): if self.alternateNicks: nick = self.alternateNicks.pop(0) From c8c2f125a18d3dad8ed1b9ef7515dde95f201e63 Mon Sep 17 00:00:00 2001 From: nyuszika7h Date: Tue, 13 Sep 2011 17:01:18 +0200 Subject: [PATCH 040/412] conf.py: remove part about server-specific password for supybot.networks..sasl.password. --- src/conf.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/conf.py b/src/conf.py index fb90e17b1..d0169b7dc 100644 --- a/src/conf.py +++ b/src/conf.py @@ -283,9 +283,8 @@ def registerNetwork(name, username='', password='', ssl=False): be the bot's account name. Due to the way SASL works, you can't use any grouped nick.""") % name, private=False)) registerGlobalValue(sasl, 'password', registry.String(password, - _("""Determines what SASL password will be used on %s. Yes, we know - that technically passwords are server-specific and not network-specific, - but this is the best we can do right now.""") % name, private=True)) + _("""Determines what SASL password will be used on %s.""") \ + % name, private=True)) return network # Let's fill our networks. From ca502c6814fb39331ab8644b4673ae6365fa7953 Mon Sep 17 00:00:00 2001 From: nyuszika7h Date: Tue, 13 Sep 2011 19:55:01 +0200 Subject: [PATCH 041/412] irclib.py: Added network name to SASL authentication success/fail. --- src/irclib.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/irclib.py b/src/irclib.py index b7dc0f648..174758699 100644 --- a/src/irclib.py +++ b/src/irclib.py @@ -900,12 +900,12 @@ class Irc(IrcCommandDispatcher): self.queueMsg(ircmsgs.user(self.ident, self.user)) def do903(self, msg): - log.info('SASL authentication successful') + log.info('%s: SASL authentication successful' % self.network) log.debug('Sending CAP END command.') self.queueMsg(ircmsgs.IrcMsg(command="CAP", args=('END',))) def do904(self, msg): - log.warning('SASL authentication failed') + log.warning('%s: SASL authentication failed' % self.network) log.debug('Aborting authentication.') log.debug('Sending CAP END command.') self.queueMsg(ircmsgs.IrcMsg(command="CAP", args=('END',))) From e140fc76f599c9d3636719ffce728c52f9485e6e Mon Sep 17 00:00:00 2001 From: nyuszika7h Date: Tue, 13 Sep 2011 19:55:31 +0200 Subject: [PATCH 042/412] conf.py: Change username to sasl_username and add it as last argument. --- src/conf.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/conf.py b/src/conf.py index d0169b7dc..6dd8692ce 100644 --- a/src/conf.py +++ b/src/conf.py @@ -258,7 +258,7 @@ class SpaceSeparatedSetOfChannels(registry.SpaceSeparatedListOf): else: return ircmsgs.join(channel) -def registerNetwork(name, username='', password='', ssl=False): +def registerNetwork(name, password='', ssl=False, sasl_username = ''): network = registerGroup(supybot.networks, name) registerGlobalValue(network, 'password', registry.String(password, _("""Determines what password will be used on %s. Yes, we know that @@ -278,7 +278,7 @@ def registerNetwork(name, username='', password='', ssl=False): _("""Determines what key (if any) will be used to join the channel."""))) sasl = registerGroup(network, 'sasl') - registerGlobalValue(sasl, 'username', registry.String(username, + registerGlobalValue(sasl, 'username', registry.String(sasl_username, _("""Determines what SASL username will be used on %s. This should be the bot's account name. Due to the way SASL works, you can't use any grouped nick.""") % name, private=False)) From 25dcadfe68b933608351bc896dbcc79fb48d055a Mon Sep 17 00:00:00 2001 From: nyuszika7h Date: Wed, 14 Sep 2011 11:39:00 +0200 Subject: [PATCH 043/412] conf.py: remove surrounding spaces around '=' for sasl_username. --- src/conf.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/conf.py b/src/conf.py index 6dd8692ce..81a47dd7a 100644 --- a/src/conf.py +++ b/src/conf.py @@ -258,7 +258,7 @@ class SpaceSeparatedSetOfChannels(registry.SpaceSeparatedListOf): else: return ircmsgs.join(channel) -def registerNetwork(name, password='', ssl=False, sasl_username = ''): +def registerNetwork(name, password='', ssl=False, sasl_username=''): network = registerGroup(supybot.networks, name) registerGlobalValue(network, 'password', registry.String(password, _("""Determines what password will be used on %s. Yes, we know that From 90ad25668ed993eecbdc1cb7d073bf84862170c2 Mon Sep 17 00:00:00 2001 From: Valentin Lorentz Date: Sun, 18 Sep 2011 10:31:09 +0200 Subject: [PATCH 044/412] Misc: Fix order of replies of @tell, in order to fix issue with nesting. Using @ignore [tell foo bar] was telling 'The operation succeeded' to foo, and ignore 'bar'. --- plugins/Misc/plugin.py | 2 +- src/version.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/plugins/Misc/plugin.py b/plugins/Misc/plugin.py index 7b7a03487..b95a84565 100644 --- a/plugins/Misc/plugin.py +++ b/plugins/Misc/plugin.py @@ -490,8 +490,8 @@ class Misc(callbacks.Plugin): irc.action = False text = '* %s %s' % (irc.nick, text) s = _('%s wants me to tell you: %s') % (msg.nick, text) - irc.reply(s, to=target, private=True) irc.replySuccess() + irc.reply(s, to=target, private=True) tell = wrap(tell, ['something', 'text']) @internationalizeDocstring diff --git a/src/version.py b/src/version.py index edae166ae..315c5cb30 100644 --- a/src/version.py +++ b/src/version.py @@ -1,3 +1,3 @@ """stick the various versioning attributes in here, so we only have to change them once.""" -version = '0.83.4.1+limnoria (2011-09-11T20:13:20+0200)' +version = '0.83.4.1+limnoria (2011-09-18T10:31:09+0200)' From 0a309155799a9174e26514a34050cc37db4c8fa9 Mon Sep 17 00:00:00 2001 From: Mika Suomalainen Date: Fri, 30 Sep 2011 20:15:43 +0300 Subject: [PATCH 045/412] ShrinkUrl: added l10n-fi. First translation in a long time. I will try to continue translating, but shcool is slowing them. --- plugins/ShrinkUrl/locale/fi.po | 160 +++++++++++++++++++++++++++++++++ 1 file changed, 160 insertions(+) create mode 100644 plugins/ShrinkUrl/locale/fi.po diff --git a/plugins/ShrinkUrl/locale/fi.po b/plugins/ShrinkUrl/locale/fi.po new file mode 100644 index 000000000..170c2ddd9 --- /dev/null +++ b/plugins/ShrinkUrl/locale/fi.po @@ -0,0 +1,160 @@ +# ShrinkUrl plugin in Limnoria. +# Copyright (C) 2011 Limnoria +# Mika Suomalainen , 2011. +# +msgid "" +msgstr "" +"Project-Id-Version: Limnoria\n" +"POT-Creation-Date: 2011-02-26 09:49+CET\n" +"PO-Revision-Date: 2011-09-30 20:14+0200\n" +"Last-Translator: Mika Suomalainen \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: pygettext.py 1.5\n" + +#: config.py:39 +msgid "" +"This plugin offers a snarfer that will go retrieve a shorter\n" +" version of long URLs that are sent to the channel. Would you\n" +" like this snarfer to be enabled?" +msgstr "" +"Tämä lisäosa tarjoaa kaappaajan,joka palauttaa lyhyemmän\n" +" version pitkistä URL-osoitteista, jotka lähetetään kanavalle. Haluaisitko\n" +" tämän kaappaajan olevan käytössä?" + +#: config.py:45 +#: config.py:49 +#, docstring +msgid "Valid values include 'ln', 'tiny', 'xrl', and 'x0'." +msgstr "Kelvollisen arvot ovat 'ln', 'tiny', 'xrl', ja 'x0'." + +#: config.py:71 +msgid "" +"Determines whether the\n" +" shrink snarfer is enabled. This snarfer will watch for URLs in the\n" +" channel, and if they're sufficiently long (as determined by\n" +" supybot.plugins.ShrinkUrl.minimumLength) it will post a\n" +" smaller URL from either ln-s.net or tinyurl.com, as denoted in\n" +" supybot.plugins.ShrinkUrl.default." +msgstr "" +"Määrittää onko kutistuskaappain käytössä.\n" +" Tämä kaappaaja vahtii URL-osoitteita kanavalla\n" +" ja jos ne ovat tarpeeksi pitkiä (määritetty asetusarvolla\n" +" supybot.plugins.ShrinkUrl.minimumLength), se lähettää lyhyemmän URL-osoitteen\n" +" joko sivustolta ln-s.net tai tinyurl.com, riippuen, minkä asetuksen\n" +" supybot.plugins.ShrinkUrl.default määrittää." + +#: config.py:78 +msgid "" +"Determines whether the snarfer will show the\n" +" domain of the URL being snarfed along with the shrunken URL." +msgstr "" +"Määrittää näyttääkö kaappaaja kaapatun URL-osoitteen domainin lyhennetyn\n" +" URL-osoitteen kanssa." + +#: config.py:81 +msgid "" +"The minimum length a URL must be before\n" +" the bot will shrink it." +msgstr "" +"Vähimmäispituus joka URL-osoitteen täytyy olla, ennen kuin\n" +" botti kutistaa sen." + +#: config.py:84 +msgid "" +"Determines what URLs are to be snarfed; URLs\n" +" matching the regexp given will not be snarfed. Give the empty string if\n" +" you have no URLs that you'd like to exclude from being snarfed." +msgstr "" +"Määrittää mitä URL-osoitteita ei kaapata; URL-osoitteet, jotka\n" +" täsmäävät annettuun säännölliseen lausekkeeseen jätetään kaappaamatta. Anna tyhjä merkkiketju, jos\n" +" et halua estää mitään URL-osoitetta tulemasta kaapatuksi." + +#: config.py:88 +msgid "" +"Determines whether the bot will shrink the\n" +" URLs of outgoing messages if those URLs are longer than\n" +" supybot.plugins.ShrinkUrl.minimumLength." +msgstr "" +"Määrittää lyhentääkö botti ulosmenevien viestien\n" +" URL-osoitteet, jos ne ovat pidempiä kuin\n" +" supybot.plugins.ShrinkUrl.minimumLength." + +#: config.py:92 +msgid "" +"Determines what website the bot will use when\n" +" shrinking a URL." +msgstr "" +"Määrittää mitä verkkosivua botti käyttää lyhentäessään\n" +" URL-osoitetta." + +#: config.py:95 +msgid "" +"Determines whether this plugin will bold\n" +" certain portions of its replies." +msgstr "" +"Määrittää korostaako botti tietyt osat\n" +" vastauksissaan." + +#: config.py:98 +msgid "" +"If set to a non-empty value, specifies the list of\n" +" services to rotate through for the shrinkSnarfer and outFilter." +msgstr "" +"Jos tämä on asetettu muuksi, kuin tyhjäksi arvoksi, määrittää listan\n" +" palveluista, joita käytetään kutistuskaappaajalle ja ulostulon suodattimelle." + +#: plugin.py:169 +#, docstring +msgid "" +"\n" +"\n" +" Returns an ln-s.net version of .\n" +" " +msgstr "" +"\n" +"\n" +" Palauttaa ln-s.net version .\n" +" " + +#: plugin.py:194 +#, docstring +msgid "" +"\n" +"\n" +" Returns a TinyURL.com version of \n" +" " +msgstr "" +"\n" +"\n" +" Palauttaa TinyURL.com palvelun lyhentämän version .\n" +" " + +#: plugin.py:222 +#, docstring +msgid "" +"\n" +"\n" +" Returns an xrl.us version of .\n" +" " +msgstr "" +"\n" +"\n" +" Palauttaa xrl.us palvelun lyhentämän version .\n" +" " + +#: plugin.py:248 +#, docstring +msgid "" +"\n" +"\n" +" Returns an x0.no version of .\n" +" " +msgstr "" +"\n" +"\n" +" Palauttaa x0.no palvelun lyhentämän version .\n" +" " + From a46176e3b1921f0bf1c9d13ce13720b651f1009e Mon Sep 17 00:00:00 2001 From: Valentin Lorentz Date: Sun, 2 Oct 2011 12:11:30 +0200 Subject: [PATCH 046/412] Fix URL to plugins and default page charset in HTTP server. --- src/httpserver.py | 8 ++++---- src/version.py | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/httpserver.py b/src/httpserver.py index ca7540931..9d5f35fb8 100644 --- a/src/httpserver.py +++ b/src/httpserver.py @@ -130,8 +130,8 @@ class SupyHTTPServerCallback: neither overriden this message or defined an handler for this query.""") def doGet(self, handler, path, *args, **kwargs): - handler.send_response(400) - self.send_header('Content_type', 'text/plain') + handler.send_response(404) + self.send_header('Content_type', 'text/plain; charset=utf-8') self.send_header('Content-Length', len(self.defaultResponse)) self.end_headers() self.wfile.write(self.defaultResponse) @@ -152,7 +152,7 @@ class Supy404(SupyHTTPServerCallback): trained to help you in such a case.""") def doGet(self, handler, path, *args, **kwargs): handler.send_response(404) - self.send_header('Content_type', 'text/plain') + self.send_header('Content_type', 'text/plain; charset=utf-8') self.send_header('Content-Length', len(self.response)) self.end_headers() self.wfile.write(self.response) @@ -181,7 +181,7 @@ class SupyIndex(SupyHTTPServerCallback): plugins = _('No plugins available.') else: plugins = '
  • %s
' % '
  • '.join( - ['%s' % (x,y.name) for x,y in plugins]) + ['%s' % (x,y.name) for x,y in plugins]) response = self.template % plugins handler.send_response(200) self.send_header('Content_type', 'text/html') diff --git a/src/version.py b/src/version.py index 315c5cb30..e942f3068 100644 --- a/src/version.py +++ b/src/version.py @@ -1,3 +1,3 @@ """stick the various versioning attributes in here, so we only have to change them once.""" -version = '0.83.4.1+limnoria (2011-09-18T10:31:09+0200)' +version = '0.83.4.1+limnoria (2011-10-02T12:11:30+0200)' From be9b027e1a9b92f6a84676e44c6ef2a2feae86fc Mon Sep 17 00:00:00 2001 From: Mika Suomalainen Date: Tue, 18 Oct 2011 17:55:14 +0300 Subject: [PATCH 047/412] Status: added l10n-fi. --- plugins/Status/locale/fi.po | 173 ++++++++++++++++++++++++++++++++++++ 1 file changed, 173 insertions(+) create mode 100644 plugins/Status/locale/fi.po diff --git a/plugins/Status/locale/fi.po b/plugins/Status/locale/fi.po new file mode 100644 index 000000000..dc2b62bbe --- /dev/null +++ b/plugins/Status/locale/fi.po @@ -0,0 +1,173 @@ +# Status plugin in Limnoria +# Copyright (C) 2011 Limnoria +# Mika Suomalainen , 2011. +# +msgid "" +msgstr "" +"Project-Id-Version: \n" +"POT-Creation-Date: 2011-08-10 11:27+CEST\n" +"PO-Revision-Date: 2011-10-18 17:29+0200\n" +"Last-Translator: Mika Suomalainen \n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: pygettext.py 1.5\n" + +#: config.py:46 +msgid "" +"Determines whether the cpu command will list\n" +" the time taken by children as well as the bot's process." +msgstr "Määrittää luetteleeko cpu komento lasten ottaman ajan\n" +" botin prosessin lisäksi." + +#: config.py:49 +msgid "" +"Determines whether the cpu command will\n" +" provide the number of threads spawned and active." +msgstr "Määrittää ilmoittaako cpu komento ilmestyneiden ja aktiiviseten ketjujen\n" +" lukumäärät." + +#: config.py:52 +msgid "" +"Determines whether the cpu command will report\n" +" the amount of memory being used by the bot." +msgstr "Määrittää ilmoittaako cpu komento\n" +" botin käyttämän muistin määrän." + +#: plugin.py:71 +msgid "" +"takes no arguments\n" +"\n" +" Returns the status of the bot.\n" +" " +msgstr "ei ota parametrejä\n" +"\n" +" Palauttaa botin tilan.\n" +" " + +#: plugin.py:80 +msgid "%s as %L" +msgstr "%s verkossa %L" + +#: plugin.py:81 +msgid "I am connected to %L." +msgstr "Olen yhdistänyt verkkoon %L" + +#: plugin.py:83 +msgid "I am currently in code profiling mode." +msgstr "Olen tällä hetkellä koodin profilointi tilassa." + +#: plugin.py:89 +msgid "" +"takes no arguments\n" +"\n" +" Returns the current threads that are active.\n" +" " +msgstr "ei ota parametrejä\n" +"\n" +" Palauttaa botin tämänhetkiset ketjut, jotka ovat aktiivisia.\n" +" " + +#: plugin.py:95 +msgid "I have spawned %n; %n %b still currently active: %L." +msgstr "Minä olen ilmestyttänyt %n; %n %b yhä aktiivinen: %L." + +#: plugin.py:103 +msgid "" +"takes no arguments\n" +"\n" +" Returns some interesting network-related statistics.\n" +" " +msgstr "ei ota parametrejä\n" +"\n" +" Palauttaa joitakin mielenkiintoisia verkkoon liittyviä tilastotietoja.\n" +" " + +#: plugin.py:111 +msgid "an indeterminate amount of time" +msgstr "määrittämätön määrä aikaa" + +#: plugin.py:112 +msgid "I have received %s messages for a total of %S. I have sent %s messages for a total of %S. I have been connected to %s for %s." +msgstr "Minä olen vastaanottanut %s viestiä yhteensä määrän %S edestä. Olen lähettänyt %s viestiä määrän %S edestä. Olen ollut yhdistettynä palvelimeen %s ajan %s." + +#: plugin.py:121 +msgid "" +"takes no arguments\n" +"\n" +" Returns some interesting CPU-related statistics on the bot.\n" +" " +msgstr "ei ota parametrejä\n" +"\n" +" Palauttaa joitakin mielenkiintoisia suoritinkäyttöön liittyviä tilastotietoja botista.\n" +" " + +#: plugin.py:131 +msgid "My children have taken %.2f seconds of user time and %.2f seconds of system time for a total of %.2f seconds of CPU time." +msgstr "Minun lapseni ovat vieneet %.2f käyttäjän aikaa ja %.2f sekuntia järjestelmän aikaa. Lapseni ovat ottaneet yhteensä %.2f sekuntia CPU aikaa." + +#: plugin.py:138 +msgid "I have taken %.2f seconds of user time and %.2f seconds of system time, for a total of %.2f seconds of CPU time. %s" +msgstr "Olen ottanut %.2f sekuntia käyttäjän aikaa %.2f sekuntia järjestelmän aikaa. Olen ottanut yhteensä %.2f sekuntia CPU ajasta. %s" + +#: plugin.py:160 +msgid "Unable to run ps command." +msgstr "ps komentoa ei pystytä suorittamaan." + +#: plugin.py:166 +msgid " I'm taking up %S of memory." +msgstr " Muistinkäyttöni on yhteensä %S." + +#: plugin.py:174 +msgid "" +"takes no arguments\n" +"\n" +" Returns some interesting command-related statistics.\n" +" " +msgstr "ei ota parametrejä\n" +"\n" +" Palauttaa joitakin mielenkiintoisia komentoihin liittyviä tilastotietoja.\n" +" " + +#: plugin.py:184 +msgid "I offer a total of %n in %n. I have processed %n." +msgstr "Tarjoan yhteensä %n määrän %n sisässä. Olen käsitellyt %n." + +#: plugin.py:193 +msgid "" +"takes no arguments\n" +"\n" +" Returns a list of the commands offered by the bot.\n" +" " +msgstr "ei ota parametrejä\n" +"\n" +" Palauttaa listan komennoista, jotka botti tarjoaa.\n" +" " + +#: plugin.py:207 +msgid "" +"takes no arguments\n" +"\n" +" Returns the amount of time the bot has been running.\n" +" " +msgstr "ei ota parametrejä\n" +"\n" +" Palauttaa ajan, jonka botti on ollut käynnissä.\n" +" " + +#: plugin.py:211 +msgid "I have been running for %s." +msgstr "Olen ollut käynnissä ajan %s." + +#: plugin.py:218 +msgid "" +"takes no arguments\n" +"\n" +" Returns the server the bot is on.\n" +" " +msgstr "ei ota parametrejä\n" +"\n" +" Palauttaa palvelimen, jolla botti on.\n" +" " + From e0185a01a0ee133e788d5e713da271f37ca1eb64 Mon Sep 17 00:00:00 2001 From: Mika Suomalainen Date: Tue, 18 Oct 2011 18:02:37 +0300 Subject: [PATCH 048/412] String: start l10n-fi. Currently only the first string is translated. --- plugins/String/locale/fi.po | 163 ++++++++++++++++++++++++++++++++++++ 1 file changed, 163 insertions(+) create mode 100644 plugins/String/locale/fi.po diff --git a/plugins/String/locale/fi.po b/plugins/String/locale/fi.po new file mode 100644 index 000000000..106e56f9e --- /dev/null +++ b/plugins/String/locale/fi.po @@ -0,0 +1,163 @@ +# String plugin in Limnoria +# Copyright (C) 2011 Limnoria +# Mika Suomalainen , 2011. +# +msgid "" +msgstr "" +"Project-Id-Version: \n" +"POT-Creation-Date: 2011-02-26 09:49+CET\n" +"PO-Revision-Date: 2011-10-18 17:56+0200\n" +"Last-Translator: Mika Suomalainen \n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: pygettext.py 1.5\n" + +#: config.py:47 +msgid "" +"Determines the maximum size of a string\n" +" given to the levenshtein command. The levenshtein command uses an O(m*n)\n" +" algorithm, which means that with strings of length 256, it can take 1.5\n" +" seconds to finish; with strings of length 384, though, it can take 4\n" +" seconds to finish, and with strings of much larger lengths, it takes more\n" +" and more time. Using nested commands, strings can get quite large, hence\n" +" this variable, to limit the size of arguments passed to the levenshtein\n" +" command." +msgstr "Määrittää levenshtein komentoon annettavan merkkiketjun maksimimäärän.\n" +" Levenshtein komento käyttää O(m*n) algoritmiä, mikä tarkoittaa, että\n" +" merkkiketju, jonka koko on 256 voi viedä 1.5\n" +" sekuntia valmistumiseen; 384:n merkit piduudella se voi viedä 4\n" +" sekuntia valmistumiseen, ja suuremmilla merkkiketjuilla, se vie\n" +" enemmän ja enemmän aikaa. Käyttäen sisäkkäisia komentoja, merkkiketjut voivat tulla hyvin pitkiksi ja tästä johtuen\n" +" tämä asetusarvo on olemassa, rajoittaakseen levenshtein komentoon annettujen parametrien määrää.\n" + +#: plugin.py:46 +msgid "" +"\n" +"\n" +" Returns the 8-bit value of .\n" +" " +msgstr "" + +#: plugin.py:55 +msgid "" +"\n" +"\n" +" Returns the character associated with the 8-bit value \n" +" " +msgstr "" + +#: plugin.py:62 +msgid "That number doesn't map to an 8-bit character." +msgstr "" + +#: plugin.py:67 +msgid "" +" \n" +"\n" +" Returns an encoded form of the given text; the valid encodings are\n" +" available in the documentation of the Python codecs module:\n" +" .\n" +" " +msgstr "" + +#: plugin.py:76 +#: plugin.py:90 +msgid "encoding" +msgstr "" + +#: plugin.py:81 +msgid "" +" \n" +"\n" +" Returns an un-encoded form of the given text; the valid encodings are\n" +" available in the documentation of the Python codecs module:\n" +" .\n" +" " +msgstr "" + +#: plugin.py:92 +msgid "base64 string" +msgstr "" + +#: plugin.py:93 +msgid "Base64 strings must be a multiple of 4 in length, padded with '=' if necessary." +msgstr "" + +#: plugin.py:99 +msgid "" +" \n" +"\n" +" Returns the levenshtein distance (also known as the \"edit distance\"\n" +" between and )\n" +" " +msgstr "" + +#: plugin.py:106 +msgid "Levenshtein distance is a complicated algorithm, try it with some smaller inputs." +msgstr "" + +#: plugin.py:114 +msgid "" +" []\n" +"\n" +" Returns the Soundex hash to a given length. The length defaults to\n" +" 4, since that's the standard length for a soundex hash. For unlimited\n" +" length, use 0.\n" +" " +msgstr "" + +#: plugin.py:125 +msgid "" +"\n" +"\n" +" Returns the length of .\n" +" " +msgstr "" + +#: plugin.py:134 +msgid "" +" \n" +"\n" +" If is of the form m/regexp/flags, returns the portion of\n" +" that matches the regexp. If is of the form\n" +" s/regexp/replacement/flags, returns the result of applying such a\n" +" regexp to .\n" +" " +msgstr "" + +#: plugin.py:146 +msgid "You probably don't want to match the empty string." +msgstr "" + +#: plugin.py:156 +msgid "" +" \n" +"\n" +" Returns XOR-encrypted with . See\n" +" http://www.yoe.org/developer/xor.html for information about XOR\n" +" encryption.\n" +" " +msgstr "" + +#: plugin.py:169 +msgid "" +"\n" +"\n" +" Returns the md5 hash of a given string. Read\n" +" http://www.rsasecurity.com/rsalabs/faq/3-6-6.html for more information\n" +" about md5.\n" +" " +msgstr "" + +#: plugin.py:180 +msgid "" +"\n" +"\n" +" Returns the SHA hash of a given string. Read\n" +" http://www.secure-hash-algorithm-md5-sha-1.co.uk/ for more information\n" +" about SHA.\n" +" " +msgstr "" + From 49ae4576b320324837db9fc8bdd31bbd46f18c13 Mon Sep 17 00:00:00 2001 From: Mika Suomalainen Date: Fri, 21 Oct 2011 17:28:08 +0300 Subject: [PATCH 049/412] String: added l10n-fi. --- plugins/String/locale/fi.po | 83 +++++++++++++++++++++++++++++-------- 1 file changed, 66 insertions(+), 17 deletions(-) diff --git a/plugins/String/locale/fi.po b/plugins/String/locale/fi.po index 106e56f9e..71f592973 100644 --- a/plugins/String/locale/fi.po +++ b/plugins/String/locale/fi.po @@ -38,7 +38,10 @@ msgid "" "\n" " Returns the 8-bit value of .\n" " " -msgstr "" +msgstr "\n" +"\n" +" Palauttaa 8-bittisen arvon.\n" +" " #: plugin.py:55 msgid "" @@ -46,11 +49,14 @@ msgid "" "\n" " Returns the character associated with the 8-bit value \n" " " -msgstr "" +msgstr "\n" +"\n" +" Palauttaa merkin, joka on yhdistetty 8-bittisen arvon.\n" +" " #: plugin.py:62 msgid "That number doesn't map to an 8-bit character." -msgstr "" +msgstr "Tuo numero ei kartoitu 8-bittiseen merkkiin." #: plugin.py:67 msgid "" @@ -60,12 +66,17 @@ msgid "" " available in the documentation of the Python codecs module:\n" " .\n" " " -msgstr "" +msgstr " \n" +"\n" +" Palauttaa salatun version annetusta tekstistä; kelvolliset salaukset\n" +" ovat saatavilla Python codecs moduulin dokumentaatiossa:\n" +" .\n" +" " #: plugin.py:76 #: plugin.py:90 msgid "encoding" -msgstr "" +msgstr "salaus" #: plugin.py:81 msgid "" @@ -75,15 +86,20 @@ msgid "" " available in the documentation of the Python codecs module:\n" " .\n" " " -msgstr "" +msgstr " \n" +"\n" +" Palauttaa salaamattoman version annetusta tekstistä; kelvolliset salaukset\n" +" ovat saatavilla Python codecs moduulin dokumentaatiossa:\n" +" .\n" +" " #: plugin.py:92 msgid "base64 string" -msgstr "" +msgstr "base64 merkkiketju" #: plugin.py:93 msgid "Base64 strings must be a multiple of 4 in length, padded with '=' if necessary." -msgstr "" +msgstr "Base64 merkkiketjujen täytyy olla kerrollisia 4:llä, pehmustettuna '='-merkillä jos vaadittu." #: plugin.py:99 msgid "" @@ -92,11 +108,15 @@ msgid "" " Returns the levenshtein distance (also known as the \"edit distance\"\n" " between and )\n" " " -msgstr "" +msgstr " \n" +"\n" +" Palauttaa levenshtein etäisyyden (tunnetaan myös nimellä \"muokkaus etäisyys\"\n" +" ja välillä.)\n" +" " #: plugin.py:106 msgid "Levenshtein distance is a complicated algorithm, try it with some smaller inputs." -msgstr "" +msgstr "Levenshtein etäisyys on monimutkainen algoritmi, kokeile sitä pienemmillä sisäänmenoilla." #: plugin.py:114 msgid "" @@ -106,7 +126,12 @@ msgid "" " 4, since that's the standard length for a soundex hash. For unlimited\n" " length, use 0.\n" " " -msgstr "" +msgstr " []\n" +"\n" +" Palauttaa Soundex hashin annetulle pituudelle. Pituus on oletuksena 4, koska se on\n" +" peruspituus. Jos haluat loputtoman pituuden,\n" +" käytä 0:aa.\n" +" " #: plugin.py:125 msgid "" @@ -114,7 +139,10 @@ msgid "" "\n" " Returns the length of .\n" " " -msgstr "" +msgstr "\n" +"\n" +" Palauttaa pituuden.\n" +" " #: plugin.py:134 msgid "" @@ -125,11 +153,17 @@ msgid "" " s/regexp/replacement/flags, returns the result of applying such a\n" " regexp to .\n" " " -msgstr "" +msgstr " \n" +"\n" +" Jos on yksi muodosta m/säännöllinen lauseke/liput, palauta\n" +" osa, joka täsmää säännölliseen lausekkeeseen. Jos on muotoa\n" +" s/säännöllinen lauseke/korvaus/liput, palauttaa sellaisen säännöllisen lausekkeen käytön\n" +" .\n" +" " #: plugin.py:146 msgid "You probably don't want to match the empty string." -msgstr "" +msgstr "Et luultavasti halua täsmätä tyhjään merkkiketjuun." #: plugin.py:156 msgid "" @@ -139,7 +173,12 @@ msgid "" " http://www.yoe.org/developer/xor.html for information about XOR\n" " encryption.\n" " " -msgstr "" +msgstr " \n" +"\n" +" Palauttaa XOR-salattuna . Katso\n" +" http://www.yoe.org/developer/xor.html saadaksesi lisätietoja XOR\n" +" salauksesta.\n" +" " #: plugin.py:169 msgid "" @@ -149,7 +188,12 @@ msgid "" " http://www.rsasecurity.com/rsalabs/faq/3-6-6.html for more information\n" " about md5.\n" " " -msgstr "" +msgstr "\n" +"\n" +" Palauttaa md5 hashin annetusta merkkiketjusta. Lue\n" +" http://www.rsasecurity.com/rsalabs/faq/3-6-6.html saadaksesi lisätietoja\n" +" md5:stä.\n" +" " #: plugin.py:180 msgid "" @@ -159,5 +203,10 @@ msgid "" " http://www.secure-hash-algorithm-md5-sha-1.co.uk/ for more information\n" " about SHA.\n" " " -msgstr "" +msgstr "\n" +"\n" +" Palauttaa SHA hashin annetulle merkkiketjulle. Lue\n" +" http://www.secure-hash-algorithm-md5-sha-1.co.uk/ saadaksesi\n" +" lisätietoa SHA:sta.\n" +" " From df5391dcf72e0113daecbb78e88cc2ac15ed8e89 Mon Sep 17 00:00:00 2001 From: Daniel Folkinshteyn Date: Sun, 11 Jul 2010 02:29:02 -0400 Subject: [PATCH 050/412] Socket driver: implement ssl connection support. Signed-off-by: James McCoy --- src/drivers/Socket.py | 28 ++++++++++++++++++++++------ 1 file changed, 22 insertions(+), 6 deletions(-) diff --git a/src/drivers/Socket.py b/src/drivers/Socket.py index 6db605a59..ff9e59146 100644 --- a/src/drivers/Socket.py +++ b/src/drivers/Socket.py @@ -46,6 +46,13 @@ import supybot.drivers as drivers import supybot.schedule as schedule from supybot.utils.iter import imap +try: + import ssl +except ImportError: + drivers.log.debug('ssl module is not available, ' + 'cannot connect to SSL servers.') + ssl = None + class SocketDriver(drivers.IrcDriver, drivers.ServersMixin): def __init__(self, irc): self.irc = irc @@ -61,12 +68,7 @@ class SocketDriver(drivers.IrcDriver, drivers.ServersMixin): self.writeCheckTime = None self.nextReconnectTime = None self.resetDelay() - # Only connect to non-SSL servers - if self.networkGroup.get('ssl').value: - drivers.log.error('The Socket driver can not connect to SSL ' - 'servers. Try the Twisted driver instead.') - else: - self.connect() + self.connect() def getDelay(self): ret = self.currentDelay @@ -139,6 +141,12 @@ class SocketDriver(drivers.IrcDriver, drivers.ServersMixin): self.irc.feedMsg(msg) except socket.timeout: pass + except ssl.SSLError, e: + if e.args[0] == 'The read operation timed out': + pass + else: + self._handleSocketError(e) + return except socket.error, e: self._handleSocketError(e) return @@ -163,6 +171,14 @@ class SocketDriver(drivers.IrcDriver, drivers.ServersMixin): drivers.log.connect(self.currentServer) try: self.conn = utils.net.getSocket(server[0]) + if self.networkGroup.get('ssl').value: + if ssl: + self.plainconn = self.conn + self.conn = ssl.wrap_socket(self.conn) + else: + drivers.log.error('ssl module not available, ' + 'cannot connect to SSL servers.') + return vhost = conf.supybot.protocols.irc.vhost() self.conn.bind((vhost, 0)) except socket.error, e: From 8f7c4bdf7f1e0d779d7b382440d62603df49582e Mon Sep 17 00:00:00 2001 From: Daniel Folkinshteyn Date: Mon, 24 Jan 2011 16:09:18 -0500 Subject: [PATCH 051/412] Fix banmask creation. Thanks Progval for the patch! fixes https://sourceforge.net/tracker/?func=detail&aid=3088559&group_id=58965&atid=489447 incorporating patch https://sourceforge.net/tracker/?func=detail&aid=3163843&group_id=58965&atid=489449 Signed-off-by: James McCoy --- src/ircutils.py | 2 +- test/test_ircutils.py | 4 ++++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/src/ircutils.py b/src/ircutils.py index 7cfa70568..2b03797b9 100644 --- a/src/ircutils.py +++ b/src/ircutils.py @@ -200,7 +200,7 @@ def banmask(hostmask): L[-1] = '*' return '*!*@' + ':'.join(L) else: - if '.' in host: + if len(host.split('.')) > 2: # If it is a subdomain return '*!*@*%s' % host[host.find('.'):] else: return '*!*@' + host diff --git a/test/test_ircutils.py b/test/test_ircutils.py index a6b73b154..1df39660b 100644 --- a/test/test_ircutils.py +++ b/test/test_ircutils.py @@ -214,6 +214,10 @@ class FunctionsTestCase(SupyTestCase): msg.prefix), '%r didn\'t match %r' % (msg.prefix, banmask)) self.assertEqual(ircutils.banmask('foobar!user@host'), '*!*@host') + self.assertEqual(ircutils.banmask('foobar!user@host.tld'), + '*!*@host.tld') + self.assertEqual(ircutils.banmask('foobar!user@sub.host.tld'), + '*!*@*.host.tld') self.assertEqual(ircutils.banmask('foo!bar@2001::'), '*!*@2001::*') def testSeparateModes(self): From 01c8dc7f78352c6e11b75b67efa0f816e0881702 Mon Sep 17 00:00:00 2001 From: James McCoy Date: Sat, 22 Oct 2011 14:57:20 -0400 Subject: [PATCH 052/412] String.decode: Only encode('utf-8') when the decode string is unicode Closes: Sf#3165718 Signed-off-by: James McCoy --- plugins/String/plugin.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/plugins/String/plugin.py b/plugins/String/plugin.py index cbacafd3f..bcfc1caa4 100644 --- a/plugins/String/plugin.py +++ b/plugins/String/plugin.py @@ -79,7 +79,12 @@ class String(callbacks.Plugin): . """ try: - irc.reply(text.decode(encoding).encode('utf-8')) + s = text.decode(encoding) + # Not all encodings decode to a unicode object. Only encode those + # that do. + if isinstance(s, unicode): + s = s.encode('utf-8') + irc.reply(s) except LookupError: irc.errorInvalid('encoding', encoding) except binascii.Error: From 964c73f591f7eafed94d7bcd6dd7b94dbb0afad5 Mon Sep 17 00:00:00 2001 From: James McCoy Date: Sat, 22 Oct 2011 15:23:56 -0400 Subject: [PATCH 053/412] RSS._getConverter: Encode strings before handing them off to other functions When the feed has a specified encoding, we'll be dealing with unicode objects in the response from feedparser.parse(). To avoid possible UnicodeErrors, we need to encode() before handing the string off to other functions, so the other functions are always dealing with bytestrings instead of bytestrings and unicode objects. Mixing unicode and bytestrings will cause implicit conversions of the unicode objects, which will most likely use the wrong encoding. Signed-off-by: James McCoy --- plugins/RSS/plugin.py | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/plugins/RSS/plugin.py b/plugins/RSS/plugin.py index b2fb31b7b..bf871b11f 100644 --- a/plugins/RSS/plugin.py +++ b/plugins/RSS/plugin.py @@ -262,8 +262,14 @@ class RSS(callbacks.Plugin): def _getConverter(self, feed): toText = utils.web.htmlToText if 'encoding' in feed: - return lambda s: toText(s).strip().encode(feed['encoding'], - 'replace') + def conv(s): + # encode() first so there implicit encoding doesn't happen in + # other functions when unicode and bytestring objects are used + # together + s = s.encode(feed['encoding'], 'replace') + s = toText(s).strip() + return s + return conv else: return lambda s: toText(s).strip() From 8fb97c56bc4017c16689d74c113a6bac843fc590 Mon Sep 17 00:00:00 2001 From: Valentin Lorentz Date: Wed, 29 Jun 2011 13:56:22 +0200 Subject: [PATCH 054/412] Owner: Fix bug with @enable and @disable if a plugin is given. Closes GH-43. Closes GH-44. Signed-off-by: James McCoy --- plugins/Owner/plugin.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/plugins/Owner/plugin.py b/plugins/Owner/plugin.py index e0d6f5332..90dacad8b 100644 --- a/plugins/Owner/plugin.py +++ b/plugins/Owner/plugin.py @@ -537,11 +537,11 @@ class Owner(callbacks.Plugin): if plugin.isCommand(command): pluginCommand = '%s.%s' % (plugin.name(), command) conf.supybot.commands.disabled().add(pluginCommand) + plugin._disabled.add(command) else: irc.error('%s is not a command in the %s plugin.' % (command, plugin.name())) return - self._disabled.add(pluginCommand, plugin.name()) else: conf.supybot.commands.disabled().add(command) self._disabled.add(command) @@ -557,8 +557,8 @@ class Owner(callbacks.Plugin): """ try: if plugin: + plugin._disabled.remove(command, plugin.name()) command = '%s.%s' % (plugin.name(), command) - self._disabled.remove(command, plugin.name()) else: self._disabled.remove(command) conf.supybot.commands.disabled().remove(command) From 5dcbe57fa3acea5db2d40343ca3f9b8116e6e827 Mon Sep 17 00:00:00 2001 From: Valentin Lorentz Date: Thu, 30 Jun 2011 19:06:22 +0200 Subject: [PATCH 055/412] AutoMode: fix bans. Signed-off-by: James McCoy --- plugins/AutoMode/plugin.py | 1 + 1 file changed, 1 insertion(+) diff --git a/plugins/AutoMode/plugin.py b/plugins/AutoMode/plugin.py index 8c7fd1a69..8100f80a9 100644 --- a/plugins/AutoMode/plugin.py +++ b/plugins/AutoMode/plugin.py @@ -30,6 +30,7 @@ import time +import supybot.conf as conf import supybot.ircdb as ircdb import supybot.ircmsgs as ircmsgs import supybot.ircutils as ircutils From ce4d26514b96bf78c7496b28500816913058c3b0 Mon Sep 17 00:00:00 2001 From: Valentin Lorentz Date: Thu, 30 Jun 2011 15:23:17 +0200 Subject: [PATCH 056/412] Relay: remove redundant nick on join/part when hostmasks enabled Signed-off-by: James McCoy --- plugins/Relay/plugin.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/plugins/Relay/plugin.py b/plugins/Relay/plugin.py index ffd31f80f..203159aa3 100644 --- a/plugins/Relay/plugin.py +++ b/plugins/Relay/plugin.py @@ -384,7 +384,7 @@ class Relay(callbacks.Plugin): return network = self._getIrcName(irc) if self.registryValue('hostmasks', channel): - hostmask = format(' (%s)', msg.prefix) + hostmask = format(' (%s)', msg.prefix.split('!')[1]) else: hostmask = '' s = format('%s%s has joined on %s', msg.nick, hostmask, network) @@ -398,7 +398,7 @@ class Relay(callbacks.Plugin): return network = self._getIrcName(irc) if self.registryValue('hostmasks', channel): - hostmask = format(' (%s)', msg.prefix) + hostmask = format(' (%s)', msg.prefix.split('!')[1]) else: hostmask = '' if len(msg.args) > 1: From 70a6e6932d2b27dc516aa031fded1afe3359a850 Mon Sep 17 00:00:00 2001 From: Valentin Lorentz Date: Fri, 15 Jul 2011 23:04:49 +0200 Subject: [PATCH 057/412] Protector: Fix variable name. Signed-off-by: James McCoy --- plugins/Protector/plugin.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/Protector/plugin.py b/plugins/Protector/plugin.py index cae90feeb..0867e48eb 100644 --- a/plugins/Protector/plugin.py +++ b/plugins/Protector/plugin.py @@ -96,7 +96,7 @@ class Protector(callbacks.Plugin): channel = msg.args[0] chanOp = ircdb.makeChannelCapability(channel, 'op') chanVoice = ircdb.makeChannelCapability(channel, 'voice') - chanhalfop = ircdb.makeChannelCapability(channel, 'halfop') + chanHalfOp = ircdb.makeChannelCapability(channel, 'halfop') if not ircdb.checkCapability(msg.prefix, chanOp): irc.sendMsg(ircmsgs.deop(channel, msg.nick)) for (mode, value) in ircutils.separateModes(msg.args[1:]): From fa8385596dc99a483da4b98946253c8282a5baa6 Mon Sep 17 00:00:00 2001 From: Valentin Lorentz Date: Thu, 30 Jun 2011 19:28:20 +0200 Subject: [PATCH 058/412] Karma: fix typo. Closes GH-38. Conflicts: plugins/Karma/locale/fi.po plugins/Karma/locale/fr.po plugins/Karma/messages.pot Signed-off-by: James McCoy --- plugins/Karma/plugin.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/Karma/plugin.py b/plugins/Karma/plugin.py index 02570b5af..392590f78 100644 --- a/plugins/Karma/plugin.py +++ b/plugins/Karma/plugin.py @@ -280,7 +280,7 @@ class Karma(callbacks.Plugin): N karmas, where N is determined by the config variable supybot.plugins.Karma.rankingDisplay. If one is given, returns the details of its karma; if more than one is given, returns - the total karma of each of the the things. is only necessary + the total karma of each of the things. is only necessary if the message isn't sent on the channel itself. """ if len(things) == 1: From 8056da06f64796a981defffe7b6e0bac462f0175 Mon Sep 17 00:00:00 2001 From: Valentin Lorentz Date: Sat, 9 Jul 2011 14:05:28 +0200 Subject: [PATCH 059/412] Channel: fix NameError: 'replyirc' -> 'replyIrc'. Closes GH-73. Conflicts: src/version.py Signed-off-by: James McCoy --- plugins/Channel/plugin.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/Channel/plugin.py b/plugins/Channel/plugin.py index 7cb51f937..e4f16f945 100644 --- a/plugins/Channel/plugin.py +++ b/plugins/Channel/plugin.py @@ -418,7 +418,7 @@ class Channel(callbacks.Plugin): nick = msg.args[1] nick = ircutils.toLower(nick) replyIrc = self.invites.pop((irc, nick), None) - if replyirc is not None: + if replyIrc is not None: replyIrc.error(format('There is no %s on this server.', nick)) class lobotomy(callbacks.Commands): From 8fb4cbcdc61c2108309afd46e5a3a516fe676fb1 Mon Sep 17 00:00:00 2001 From: Valentin Lorentz Date: Mon, 18 Jul 2011 15:23:06 +0200 Subject: [PATCH 060/412] Factoids: Fix typo. Conflicts: plugins/Factoids/locale/fi.po plugins/Factoids/locale/fr.po plugins/Factoids/messages.pot src/version.py Signed-off-by: James McCoy --- plugins/Factoids/plugin.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/Factoids/plugin.py b/plugins/Factoids/plugin.py index 30d366fce..f534eeb42 100644 --- a/plugins/Factoids/plugin.py +++ b/plugins/Factoids/plugin.py @@ -382,7 +382,7 @@ class Factoids(callbacks.Plugin, plugins.ChannelDBHandler): """[] [--values] [--{regexp} ] [ ...] Searches the keyspace for keys matching . If --regexp is given, - it associated value is taken as a regexp and matched against the keys. + its associated value is taken as a regexp and matched against the keys. If --values is given, search the value space instead of the keyspace. """ if not optlist and not globs: From 9561c9f41744d70677bf7d8e15a73c9e30ac2502 Mon Sep 17 00:00:00 2001 From: Valentin Lorentz Date: Sat, 30 Oct 2010 12:24:02 +0200 Subject: [PATCH 061/412] Topic: Fix bad doctring Conflicts: plugins/Topic/messages.pot Signed-off-by: James McCoy --- plugins/Topic/plugin.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/Topic/plugin.py b/plugins/Topic/plugin.py index ac9fef272..8cb3387ed 100644 --- a/plugins/Topic/plugin.py +++ b/plugins/Topic/plugin.py @@ -351,7 +351,7 @@ class Topic(callbacks.Plugin): def unlock(self, irc, msg, args, channel): """[] - Locks the topic (sets the mode +t) in . is only + Unlocks the topic (sets the mode +t) in . is only necessary if the message isn't sent in the channel itself. """ irc.queueMsg(ircmsgs.mode(channel, '-t')) From f1690e68677b1c433e25b2c8766338bf995bceee Mon Sep 17 00:00:00 2001 From: Valentin Lorentz Date: Wed, 20 Jul 2011 21:28:43 +0200 Subject: [PATCH 062/412] Topic: fix typo in @unlock help. Conflicts: plugins/Topic/locale/fr.po plugins/Topic/messages.pot src/version.py Signed-off-by: James McCoy --- plugins/Topic/plugin.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/Topic/plugin.py b/plugins/Topic/plugin.py index 8cb3387ed..d3dde3a6b 100644 --- a/plugins/Topic/plugin.py +++ b/plugins/Topic/plugin.py @@ -351,7 +351,7 @@ class Topic(callbacks.Plugin): def unlock(self, irc, msg, args, channel): """[] - Unlocks the topic (sets the mode +t) in . is only + Unlocks the topic (sets the mode -t) in . is only necessary if the message isn't sent in the channel itself. """ irc.queueMsg(ircmsgs.mode(channel, '-t')) From a1a90f76735295a02c5a1450fcbcc571fcb18c24 Mon Sep 17 00:00:00 2001 From: Valentin Lorentz Date: Sun, 7 Aug 2011 12:02:06 +0200 Subject: [PATCH 063/412] NickCapture: Fix plugin help and l10n-fr. Closes GH-116. Conflicts: plugins/NickCapture/locale/fr.po plugins/NickCapture/messages.pot src/version.py Signed-off-by: James McCoy --- plugins/NickCapture/plugin.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/NickCapture/plugin.py b/plugins/NickCapture/plugin.py index e81ad5718..56db6347c 100644 --- a/plugins/NickCapture/plugin.py +++ b/plugins/NickCapture/plugin.py @@ -35,7 +35,7 @@ import supybot.ircutils as ircutils import supybot.callbacks as callbacks class NickCapture(callbacks.Plugin): - """This module constantly tries to take whatever nick is configured as + """This plugin constantly tries to take whatever nick is configured as supybot.nick. Just make sure that's set appropriately, and thus plugin will do the rest.""" public = False From 0869a8e271e9951219dcddd228bec9cb08fc291f Mon Sep 17 00:00:00 2001 From: James McCoy Date: Sun, 23 Oct 2011 20:26:39 -0400 Subject: [PATCH 064/412] Channel.nicks: Raise error so we don't actually reply with the nicks. Closes: Sf#3396388 Signed-off-by: James McCoy --- plugins/Channel/plugin.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/plugins/Channel/plugin.py b/plugins/Channel/plugin.py index 7cb51f937..db12afb37 100644 --- a/plugins/Channel/plugin.py +++ b/plugins/Channel/plugin.py @@ -788,7 +788,8 @@ class Channel(callbacks.Plugin): msg.args[0] != channel and \ (ircutils.isChannel(msg.args[0]) or \ msg.nick not in irc.state.channels[channel].users): - irc.error('You don\'t have access to that information.') + irc.error('You don\'t have access to that information.', + Raise=True) L = list(irc.state.channels[channel].users) utils.sortBy(str.lower, L) irc.reply(utils.str.commaAndify(L)) From 9d33bc26cbba2d1172d3701b2a911781861e93df Mon Sep 17 00:00:00 2001 From: Mika Suomalainen Date: Tue, 25 Oct 2011 15:26:17 +0300 Subject: [PATCH 065/412] Success: added l10n-fi. --- plugins/Success/locale/fi.po | 35 +++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) create mode 100644 plugins/Success/locale/fi.po diff --git a/plugins/Success/locale/fi.po b/plugins/Success/locale/fi.po new file mode 100644 index 000000000..94f320e03 --- /dev/null +++ b/plugins/Success/locale/fi.po @@ -0,0 +1,35 @@ +# Success plugin in Limnoria. +# Copyright (C) 2011 Limnoria +# Mika Suomalainen , 2011. +# +msgid "" +msgstr "" +"Project-Id-Version: \n" +"POT-Creation-Date: 2011-02-26 09:49+CET\n" +"PO-Revision-Date: 2011-10-25 15:18+0200\n" +"Last-Translator: Mika Suomalainen \n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: pygettext.py 1.5\n" + +#: config.py:49 +msgid "" +"Determines whether the bot will prefix the nick\n" +" of the user giving an invalid command to the success response." +msgstr "Määrittää lisääkö botti käyttäjän nimimerkin lähettämänsä viestin alkuun, jos\n" +" käyttäjä antaa viallisen komennon onnistumisvastaukselle." + +#: plugin.py:38 +msgid "" +"This plugin was written initially to work with MoobotFactoids, the two\n" +" of them to provide a similar-to-moobot-and-blootbot interface for factoids.\n" +" Basically, it replaces the standard 'The operation succeeded.' messages\n" +" with messages kept in a database, able to give more personable\n" +" responses." +msgstr "Tämä lisäosa kirjoitettiin alunperin toimimaan MoobotFactoids lisäosan kanssa, molemmat kaksi\n" +" tarjoaisivat samankaltainen-kuin-moobot-ja-blootbot käyttöliittymän factoideille.\n" +" Perusteellisesti, se korvaa perus 'Tehtävä suoritettu.' viestit\n" +" vastauksilla tietokannoista, antaen mahdollisuuden luoda persoonallisempia\n" +" vastauksia." From 12ee3bd200b528880d8a1fda1245b060d96656c4 Mon Sep 17 00:00:00 2001 From: Mika Suomalainen Date: Tue, 25 Oct 2011 15:32:43 +0300 Subject: [PATCH 066/412] Success: fixed author email. --- plugins/Success/locale/fi.po | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/Success/locale/fi.po b/plugins/Success/locale/fi.po index 94f320e03..4e18f870d 100644 --- a/plugins/Success/locale/fi.po +++ b/plugins/Success/locale/fi.po @@ -1,6 +1,6 @@ # Success plugin in Limnoria. # Copyright (C) 2011 Limnoria -# Mika Suomalainen , 2011. +# Mika Suomalainen , 2011. # msgid "" msgstr "" From 27e4dd6a88330a51736b2b85b781a593827fdb9a Mon Sep 17 00:00:00 2001 From: nyuszika7h Date: Tue, 25 Oct 2011 14:44:56 +0200 Subject: [PATCH 067/412] Alias: Add l10n-hu --- plugins/Alias/locale/hu.po | 107 +++++++++++++++++++++++++++++++++++++ 1 file changed, 107 insertions(+) create mode 100644 plugins/Alias/locale/hu.po diff --git a/plugins/Alias/locale/hu.po b/plugins/Alias/locale/hu.po new file mode 100644 index 000000000..8b83459c9 --- /dev/null +++ b/plugins/Alias/locale/hu.po @@ -0,0 +1,107 @@ +# Limnoria Alias plugin. +# Copyright (C) 2011 Limnoria +# nyuszika7h , 2011. +# +msgid "" +msgstr "" +"Project-Id-Version: Limnoria Alias\n" +"POT-Creation-Date: 2011-02-26 09:49+CET\n" +"PO-Revision-Date: 2011-10-25 14:42+0200\n" +"Last-Translator: nyuszika7h \n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: pygettext.py 1.5\n" + + +#: plugin.py:45 +#, docstring +msgid "" +"Returns the channel the msg came over or the channel given in args.\n" +"\n" +" If the channel was given in args, args is modified (the channel is\n" +" removed).\n" +" " +msgstr "" +"Kiírja a csatorna nevét, ahonnan az üzenet jött, vagy a paraméterként megadott csatornát.\n" +"\n" +"Ha a csatorna meg volt adva paraméterként, a paraméterek módosulnak (a csatorna eltávolításra kerül)." + +#: plugin.py:164 +msgid " at least" +msgstr " legalább" + +#: plugin.py:165 +msgid "" +"\n" +"\n" +"Alias for %q." +"\n" +"\n" +" Locks an alias so that no one else can change it.\n" +" " +msgstr "" +"<álnév>\n" +"\n" +"Lezár egy álnevet, hogy senki más ne változtathassa meg." + +#: plugin.py:229 plugin.py:243 +msgid "There is no such alias." +msgstr "Nincs ilyen álnév." + +#: plugin.py:234 +#, docstring +msgid "" +"\n" +"\n" +" Unlocks an alias so that people can define new aliases over it.\n" +" " +msgstr "" +"<álnév>\n" +"\n" +"Feloldja egy álnév lezárását, hogy az emberek új álnevekkel írhassák felül." + +#: plugin.py:254 +msgid "That name isn't valid. Try %q instead." +msgstr "Ez a név érvénytelen. Próbáld meg %q-t inkább." + +#: plugin.py:292 +#, docstring +msgid "" +" \n" +"\n" +" Defines an alias that executes . The \n" +" should be in the standard \"command argument [nestedcommand argument]\"\n" +" arguments to the alias; they'll be filled with the first, second, etc.\n" +" arguments. $1, $2, etc. can be used for required arguments. @1, @2,\n" +" etc. can be used for optional arguments. $* simply means \"all\n" +" remaining arguments,\" and cannot be combined with optional arguments.\n" +" " +msgstr "" +" <álnév>\n" +"\n" +"Meghatároz egy nevű álnevet, amely futtatja <álnév> parancsot. Az <álnév>-nek a szabványos \"parancs paraméter [beágyazottparancs paraméter]\" álnév paraméterei formában kell lennie; ezek ki lesznek töltve az első, második stb. paraméterekkel. $1, $2 stb. használható kötelező paraméterekhez. @1, @2 stb. használható választható paraméterekhez. $* azt jelenti, \"az összes hátralévő paraméter,\" és nem kombinálható választható paraméterekkel." + +#: plugin.py:315 +#, docstring +msgid "" +"\n" +"\n" +" Removes the given alias, if unlocked.\n" +" " +msgstr "" +"\n" +"\n" +"Eltávolítja a megadott álnevet, ha nincs lezárva.\n" From f76c7e33dc3642929d2b6d7501710d0820566a65 Mon Sep 17 00:00:00 2001 From: Mika Suomalainen Date: Tue, 25 Oct 2011 16:28:18 +0300 Subject: [PATCH 068/412] Time: Add l10n-fi. --- plugins/Time/locale/fi.po | 143 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 143 insertions(+) create mode 100644 plugins/Time/locale/fi.po diff --git a/plugins/Time/locale/fi.po b/plugins/Time/locale/fi.po new file mode 100644 index 000000000..761083ccd --- /dev/null +++ b/plugins/Time/locale/fi.po @@ -0,0 +1,143 @@ +# Time plugin in Limnoria. +# Copyright (C) 2011 Limnoria +# Mika Suomalainen , 2011. +# +msgid "" +msgstr "" +"Project-Id-Version: \n" +"POT-Creation-Date: 2011-02-26 09:49+CET\n" +"PO-Revision-Date: 2011-10-25 15:43+0200\n" +"Last-Translator: Mika Suomalainen \n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: pygettext.py 1.5\n" + +#: config.py:45 +msgid "" +"Determines the\n" +" format string for timestamps. Refer to the Python documentation for the\n" +" time module to see what formats are accepted. If you set this variable to\n" +" the empty string, the timestamp will not be shown." +msgstr "Määrittää\n" +" muotoketjun aikaleimoille. Katso Python documentaatiosta\n" +" aikamoduulin kohdalta nähdäksesi, mitkä muodot hyväksytään. Jos asetat tämän tyhjäksi\n" +" merkkiketjuksi, aikaleimaa ei näytetä." + +#: plugin.py:61 +msgid "" +"[y] [w] [d] [h] [m] [s]\n" +"\n" +" Returns the number of seconds in the number of , ,\n" +" , , , and given. An example usage is\n" +" \"seconds 2h 30m\", which would return 9000, which is '3600*2 + 30*60'.\n" +" Useful for scheduling events at a given number of seconds in the\n" +" future.\n" +" " +msgstr "[y] [w] [d] [h] [m] [s]\n" +"\n" +" Palauttaa annettujen , ,\n" +" , , , ja määrän sekunteina. Esimerkki käyttö on\n" +" \"seconds 2h 30m\", joka palauttaisi 9000, joka on '3600*2 + 30*60'.\n" +" Hyödyllinen ajastamaan tapahtumia annettujen sekuntien päästä\n" +" tulevaisuudessa.\n" +" " + +#: plugin.py:96 +msgid "" +"