ubuntu-bots/Bugtracker/config.py

176 lines
8.6 KiB
Python

# -*- 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', [])
}