# -*- Encoding: utf-8 -*- ### # Copyright (c) 2005-2007 Dennis Kaarsemaker # Copyright (c) 2008-2011 Terence Simpson # Copyright (c) 2017- Krytarik Raido # # This program is free software; you can redistribute it and/or modify # it under the terms of version 2 of the GNU General Public License as # published by the Free Software Foundation. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # ### import supybot.conf as conf import supybot.registry as registry import supybot.ircutils as ircutils import supybot.log as supylog from .trackers import defined_bugtrackers class Bugtrackers(registry.SpaceSeparatedListOfStrings): List = ircutils.IrcSet def configure(advanced): from supybot.questions import expect, something, yn, output def anything(prompt, default=None): """Because supybot is pure fail""" from supybot.questions import expect return expect(prompt, [], default=default) Bugtracker = conf.registerPlugin('Bugtracker', True) def getRepeatdelay(): output("How many seconds should the bot wait before repeating bug information?") repeatdelay = something("Enter a number greater or equal to 0.", default=Bugtracker.repeatdelay._default) try: repeatdelay = int(repeatdelay) if repeatdelay < 0: raise TypeError except TypeError: output("Invalid value '%s', it must be an integer greater or equal to 0." % repeatdelay) return getRepeatdelay() else: return repeatdelay output("Each of the next 4 questions can be set per-channel with the '@config channel' command.") bugSnarfer = yn("Enable detecting bug numbers and URLs in all channels?", default=Bugtracker.bugSnarfer._default) commitSnarfer = yn("Enable detecting commit hashes and URLs in all channels?", default=Bugtracker.commitSnarfer._default) cveSnarfer = yn("Enable detecting CVE numbers and URLs in all channels?", default=Bugtracker.cveSnarfer._default) oopsSnarfer = yn("Enable detecting Launchpad OOPS IDs in all channels?", default=Bugtracker.oopsSnarfer._default) if advanced: replyNoBugtracker = something("What should the bot reply with when a user requests information from an unknown bug tracker?", default=Bugtracker.replyNoBugtracker._default) snarfTarget = something("What should be the default bug tracker used when none is specified?", default=Bugtracker.snarfTarget._default) replyWhenNotFound = yn("Should the bot report when a bug is not found?", default=Bugtracker.replyWhenNotFound._default) replyWhenError = yn("Should the bot report when an error occurs on getting a bug?", default=Bugtracker.replyWhenError._default) repeatdelay = getRepeatdelay() else: replyNoBugtracker = Bugtracker.replyNoBugtracker._default snarfTarget = Bugtracker.snarfTarget._default replyWhenNotFound = Bugtracker.replyWhenNotFound._default replyWhenError = Bugtracker.replyWhenError._default repeatdelay = Bugtracker.repeatdelay._default showassignee = yn("Show the assignee of a bug in the reply?", default=Bugtracker.showassignee._default) extended = yn("Show tracker-specific extended infomation?", default=Bugtracker.extended._default) saveDiscoveredTrackers = yn("Save automatically discovered trackers to configuration?", default=Bugtracker.saveDiscoveredTrackers._default) Bugtracker.bugSnarfer.setValue(bugSnarfer) Bugtracker.commitSnarfer.setValue(commitSnarfer) Bugtracker.cveSnarfer.setValue(cveSnarfer) Bugtracker.oopsSnarfer.setValue(oopsSnarfer) Bugtracker.replyNoBugtracker.setValue(replyNoBugtracker) Bugtracker.snarfTarget.setValue(snarfTarget) Bugtracker.replyWhenNotFound.setValue(replyWhenNotFound) Bugtracker.replyWhenError.setValue(replyWhenError) Bugtracker.repeatdelay.setValue(repeatdelay) Bugtracker.showassignee.setValue(showassignee) Bugtracker.extended.setValue(extended) Bugtracker.saveDiscoveredTrackers.setValue(saveDiscoveredTrackers) Bugtracker = conf.registerPlugin('Bugtracker') conf.registerChannelValue(Bugtracker, 'bugSnarfer', registry.Boolean(False, """Determines whether the bug snarfer will be enabled, such that any bugtracker URLs and bug ### seen in the channel will have their information reported into the channel.""")) conf.registerChannelValue(Bugtracker, 'commitSnarfer', registry.Boolean(False, """Determines whether the commit snarfer will be enabled, such that any commit URLs and commit ### seen in the channel will have their information reported into the channel.""")) conf.registerChannelValue(Bugtracker, 'cveSnarfer', registry.Boolean(False, """Determines whether the CVE snarfer will be enabled, such that any CVE URLs and CVE-????-???? seen in the channel will have their information reported into the channel.""")) conf.registerChannelValue(Bugtracker, 'oopsSnarfer', registry.Boolean(False, """Determines whether the OOPS snarfer will be enabled, such that any OOPS ### seen in the channel will have their information reported into the channel.""")) conf.registerChannelValue(Bugtracker, 'replyNoBugtracker', registry.String("I have no bugtracker '%s'", """Determines the phrase to use when notifying the user that there is no information about that bugtracker site.""")) conf.registerChannelValue(Bugtracker, 'snarfTarget', registry.String('launchpad', """Determines the bugtracker to query when the snarf command is triggered""")) conf.registerGlobalValue(Bugtracker, 'bugtrackers', Bugtrackers([], """Determines what bugtrackers will be added to the bot when it starts.""")) conf.registerGlobalValue(Bugtracker, 'replyWhenNotFound', registry.Boolean(False, """Whether to send a message when a bug could not be found""")) conf.registerGlobalValue(Bugtracker, 'replyWhenError', registry.Boolean(False, """Whether to send a message when an error occurred on getting a bug""")) conf.registerChannelValue(Bugtracker, 'repeatdelay', registry.Integer(60, """Number of seconds to wait between repeated bug calls""")) conf.registerChannelValue(Bugtracker, 'showassignee', registry.Boolean(False, """Whether to show the assignee in bug reports""")) conf.registerChannelValue(Bugtracker, 'extended', registry.Boolean(False, """Whether to show extended bug information, specific to trackers""")) conf.registerGlobalValue(Bugtracker, 'saveDiscoveredTrackers', registry.Boolean(False, """Whether to save automatically discovered trackers to configuration""")) def registerBugtracker(name, url='', description='', trackertype='', aliases=[]): Bugtracker.bugtrackers().add(name) group = conf.registerGroup(Bugtracker.bugtrackers, name) URL = conf.registerGlobalValue(group, 'url', registry.String('', 'URL of the tracker.')) DESC = conf.registerGlobalValue(group, 'description', registry.String('', 'Full name of the tracker.')) TRACKERTYPE = conf.registerGlobalValue(group, 'trackertype', registry.String('', 'Type of the tracker.')) ALIASES = conf.registerGlobalValue(group, 'aliases', registry.SpaceSeparatedSetOfStrings([], 'Aliases of the tracker.')) if url: URL.setValue(url) if description: DESC.setValue(description) if aliases: ALIASES.setValue(aliases) if trackertype: if trackertype in defined_bugtrackers: TRACKERTYPE.setValue(trackertype) else: supylog.warning("Bugtracker: Unknown trackertype '%s' (%s)" % (trackertype, name)) for name in Bugtracker.bugtrackers(): registerBugtracker(name) default_bugtrackers = { 'mozilla': ('https://bugzilla.mozilla.org', 'Mozilla', 'bugzilla', []), 'gtk': ('https://gitlab.gnome.org/GNOME/gtk/-/issues', 'GTK', 'gitlab', []), 'kde': ('https://bugs.kde.org', 'KDE', 'bugzilla', []), 'lxde': ('https://sourceforge.net/p/lxde/bugs', 'LXDE', 'sourceforge', []), 'openoffice': ('https://bz.apache.org/ooo', 'OpenOffice', 'bugzilla', []), 'launchpad': ('https://launchpad.net', 'Launchpad', 'launchpad', ['lp', 'ubuntu', 'ubottu']), 'debian': ('https://bugs.debian.org', 'Debian', 'debbugs', []), 'irssi': ('https://github.com/irssi/irssi/issues', 'Irssi', 'github', []), 'cgit': ('https://git.zx2c4.com/cgit/commit', 'CGit', 'cgit', []), 'mantis': ('https://www.mantisbt.org/bugs', 'Mantis', 'mantis', []), 'trac': ('https://trac.edgewall.org/ticket', 'Trac', 'trac', []), 'pidgin': ('https://developer.pidgin.im/ticket', 'Pidgin', 'trac', []) }