diff --git a/TriviaTime/.gitignore b/TriviaTime/.gitignore index d84b9da..7807c2d 100644 --- a/TriviaTime/.gitignore +++ b/TriviaTime/.gitignore @@ -1,3 +1,10 @@ +# Questions +storage/ +!storage/db/ + +# Configurations +config.php + *.py[cod] # C extensions diff --git a/TriviaTime/README.md b/TriviaTime/README.md index 5252020..38895c0 100644 --- a/TriviaTime/README.md +++ b/TriviaTime/README.md @@ -1,8 +1,4 @@ -Forked from https://github.com/tannn/TriviaTime - -#Configuration - -See Jeopardy plugin for using jservice.io (156,800+ Jeopardy! questions) as trivia question source +# Configuration Requires Limnoria and Python 3 @@ -30,7 +26,33 @@ Requires Limnoria and Python 3 ## Question editing tools TriviaTime was designed to make editing, deleting, and adding questions a breeze, for both administrators and players. However, due to the amount of tools available, it can be complicated to new players. Instructions on these tools are available [here][]. -#How to set up the website +## How to modify configuration + +Do not touch `config.py` or any other configuration file. Instead, use the Config plugin on IRC: + +``` +.config plugins.pluginName.parameterGroup.parameterName value +``` + +Examples: +``` +# Modify duration of time in between hints to 15 seconds: +.config plugins.triviatime.questions.hinttime 15 + +# Modify duration of time in between KAOS hints to 20 seconds: +.config plugins.triviatime.kaos.hintkaos 20 + +# Modify command to show additional hint to ~: +.config plugins.triviatime.commands.extraHint ~ +``` + +For a full list of general Limnoria configuration parameters, see the `.conf` file in the bot base directory. + +For a full list of TriviaTime configuration parameters, refer to `config.py` in the `TriviaTime/` directory. + +--- + +# How to set up the website ## Download and Install 1. Install PHP (for PDO) and PHP-SQLite. diff --git a/TriviaTime/config.py b/TriviaTime/config.py index 2c1f0dc..fc26b53 100644 --- a/TriviaTime/config.py +++ b/TriviaTime/config.py @@ -42,7 +42,7 @@ conf.registerChannelValue(TriviaTime.admin, 'file', # timeout, number of hints, values conf.registerChannelValue(TriviaTime.commands, 'extraHint', - registry.NormalizedString(""".""", + registry.NormalizedString("""~""", """The command to show extra hints and remaining KAOS""") ) @@ -57,7 +57,7 @@ conf.registerChannelValue(TriviaTime.general, 'globalStats', ) conf.registerChannelValue(TriviaTime.hints, 'extraHintTime', - registry.Integer(90, + registry.Integer(10, """Number of seconds a user must wait between uses of the extra hint command.""") ) @@ -72,12 +72,12 @@ conf.registerChannelValue(TriviaTime.general, 'showStats', ) conf.registerChannelValue(TriviaTime.skip, 'skipThreshold', - registry.Float(.5, + registry.Float(.50, """Percentage of active players who need to vote for a question to be skipped""") ) conf.registerChannelValue(TriviaTime.skip, 'skipActiveTime', - registry.Integer((10*60), + registry.Integer((30*60), """Amount of seconds a user is considered active after answering a question""") ) @@ -87,22 +87,22 @@ conf.registerChannelValue(TriviaTime.skip, 'skipTime', ) conf.registerChannelValue(TriviaTime.questions, 'hintTime', - registry.Integer(10, + registry.Integer(15, """Seconds between hints""") ) conf.registerChannelValue(TriviaTime.kaos, 'hintKAOS', - registry.Integer(15, + registry.Integer(20, """Seconds between KAOS hints""") ) conf.registerChannelValue(TriviaTime.general, 'waitTime', - registry.Integer(15, + registry.Integer(20, """Seconds between the end of one question and the start of another""") ) conf.registerChannelValue(TriviaTime.voice, 'enableVoice', - registry.Boolean(True, + registry.Boolean(False, """Voice top players for week, month, and year""") ) @@ -117,42 +117,42 @@ conf.registerChannelValue(TriviaTime.voice, 'timeoutVoice', ) conf.registerChannelValue(TriviaTime.voice, 'numTopToVoice', - registry.Integer(10, + registry.Integer(25, """The number of top players who are elligible for voice""") ) conf.registerChannelValue(TriviaTime.voice, 'minPointsVoiceWeek', - registry.Integer(30000, + registry.Integer(750, """Points required to be voiced for being top player in the week""") ) conf.registerChannelValue(TriviaTime.voice, 'minPointsVoiceMonth', - registry.Integer(100000, + registry.Integer(5000, """Points required to be voiced for being top player in the month""") ) conf.registerChannelValue(TriviaTime.voice, 'minPointsVoiceYear', - registry.Integer(5000000, + registry.Integer(25000, """Points required to be voiced for being top player in the year""") ) conf.registerChannelValue(TriviaTime.kaos, 'payoutKAOS', - registry.Integer(1000, + registry.Integer(10, """Extra points for teamwork on KAOS""") ) conf.registerChannelValue(TriviaTime.general, 'timeout', - registry.Integer(600, + registry.Integer(604800, """Time before game shuts off in seconds""") ) conf.registerChannelValue(TriviaTime.questions, 'defaultPoints', - registry.Integer(500, + registry.Integer(10, """Default points for a correct answer to a normal question""") ) conf.registerChannelValue(TriviaTime.kaos, 'defaultKAOS', - registry.Integer(300, + registry.Integer(15, """Default points for a correct KAOS answer""") ) diff --git a/TriviaTime/php/views/about.html.php b/TriviaTime/php/views/about.html.php index 3c89ca4..08a6a1d 100644 --- a/TriviaTime/php/views/about.html.php +++ b/TriviaTime/php/views/about.html.php @@ -1,6 +1,6 @@

About TriviaTime

-

We are #trivialand on Freenode. Come join us!

+

We are #trivia on Snoonet. Come join us!

@@ -11,7 +11,7 @@

Source

-

The source code is available on GitHub, be sure to check it out. +

The source code is available on GitHub, be sure to check it out. Fork us and contribute!

diff --git a/TriviaTime/php/views/footer.html.php b/TriviaTime/php/views/footer.html.php index 798459a..b4ec9f2 100644 --- a/TriviaTime/php/views/footer.html.php +++ b/TriviaTime/php/views/footer.html.php @@ -1,5 +1,5 @@
diff --git a/TriviaTime/plugin.py b/TriviaTime/plugin.py index e368e0d..148974c 100644 --- a/TriviaTime/plugin.py +++ b/TriviaTime/plugin.py @@ -194,14 +194,14 @@ class Game: if ircutils.toLower(self.lastWinner) != usernameCanonical: #streakbreak if self.streak > minStreak: - streakBonus = points * .05 + streakBonus = int(points * .25) self.sendMessage('\x02%s\x02 broke \x02%s\x02\'s streak of \x02%d\x02!' % (username, self.lastWinner, self.streak)) self.lastWinner = username self.streak = 1 else: self.streak += 1 - streakBonus = points * .01 * (self.streak-1) - streakBonus = min(streakBonus, points * .5) + streakBonus = points * .25 * (self.streak-1) + streakBonus = int(min(streakBonus, points * .25)) # Update database threadStorage.updateGameStreak(self.channel, self.lastWinner, self.streak) @@ -212,7 +212,7 @@ class Game: # Show congratulatory message self.lastAnswer = time.time() - self.sendMessage('DING DING DING, \x02%s\x02 got the correct answer, \x02%s\x02, in \x02%0.4f\x02 seconds for \x02%d(+%d)\x02 points!' % (username, correctAnswer, timeElapsed, points, streakBonus)) + self.sendMessage('YES, \x02%s\x02 got the correct answer, \x02%s\x02, in \x02%0.4f\x02 seconds for \x02%d(+%d)\x02 points!' % (username, correctAnswer, timeElapsed, points, streakBonus)) if self.registryValue('general.showStats', self.channel): if self.registryValue('general.globalStats'): @@ -224,16 +224,19 @@ class Game: todaysScore = stat['points_day'] weekScore = stat['points_week'] monthScore = stat['points_month'] + yearScore = stat['points_year'] + totalScore = stat['points_total'] recapMessageList = ['\x02%s\x02 has won \x02%d\x02 in a row!' % (username, self.streak)] recapMessageList.append(' Total Points') recapMessageList.append(' TODAY: \x02%d\x02' % (todaysScore)) if weekScore > points: - recapMessageList.append(' this WEEK \x02%d\x02' % (weekScore)) - if weekScore > points or todaysScore > points: - if monthScore > points: - recapMessageList.append(' &') + recapMessageList.append(' this WEEK: \x02%d\x02' % (weekScore)) if monthScore > points: recapMessageList.append(' this MONTH: \x02%d\x02' % (monthScore)) + if yearScore > points: + recapMessageList.append(' this YEAR: \x02%d\x02' % (yearScore)) + if totalScore > points: + recapMessageList.append(' & ALL TIME: \x02%d\x02' % (totalScore)) recapMessage = ''.join(recapMessageList) self.sendMessage(recapMessage) @@ -587,12 +590,13 @@ class Game: if len(questionParts) > 1: question = questionParts[0].strip() answers = [] - # Parse question and answers + # Parse question for KAOS if ircutils.toLower(question[:4]) == 'kaos': questionType = 'kaos' for ans in questionParts[1:]: if answers.count(ans) == 0: # Filter out duplicate answers answers.append(str(ans).strip()) + # Parse question for Unscramble elif ircutils.toLower(question[:5]) == 'uword': questionType = 'uword' ans = questionParts[1] @@ -600,11 +604,13 @@ class Game: shuffledLetters = list(str(ans)) random.shuffle(shuffledLetters) question = 'Unscramble the letters: {0}'.format(' '.join(shuffledLetters)) + # Parse standard question else: questionType = 'regular' for ans in questionParts[1:]: answers.append(str(ans).strip()) + # Calculate base points if questionType == 'kaos': points = self.registryValue('kaos.defaultKAOS', self.channel) * len(answers) else: @@ -628,9 +634,9 @@ class Game: # default question, everything went wrong with grabbing question return {'id': rawData['id'], 'type': 'kaos', - 'points': 10050, - 'question': 'KAOS: The 10 Worst U.S. Presidents (Last Name Only)? (This is a panic question, if you see this report this question. it is malformed.)', - 'answers': ['Bush', 'Nixon', 'Hoover', 'Grant', 'Johnson', 'Ford', 'Reagan', 'Coolidge', 'Pierce'] + 'points': 10, + 'question': 'KAOS: The most awesome users in this channel? (This is a panic question, if you see this report this question. it is malformed. Please report immediately.)', + 'answers': ['cars', 'some_weirdo', 'kessa', 'paimun'] } def sendMessage(self, msg, color=None, bgcolor=None): @@ -1452,11 +1458,11 @@ class Storage: c.close() return row - def getDeleteTop3(self, page=1, amount=3, channel=None): + def getDeleteTop5(self, page=1, amount=5, channel=None): if page < 1: page=1 if amount < 1: - amount=3 + amount = 5 page -= 1 start = page * amount c = self.conn.cursor() @@ -1493,11 +1499,11 @@ class Storage: c.close() return row - def getReportTop3(self, page=1, amount=3, channel=None): + def getReportTop5(self, page=1, amount=5, channel=None): if page < 1: page=1 if amount < 1: - amount=3 + amount = 5 page -= 1 start = page * amount c = self.conn.cursor() @@ -1516,11 +1522,11 @@ class Storage: c.close() return rows - def getTemporaryQuestionTop3(self, page=1, amount=3, channel=None): + def getTemporaryQuestionTop5(self, page=1, amount=5, channel=None): if page < 1: page=1 if amount < 1: - amount=3 + amount = 5 page -= 1 start = page * amount c = self.conn.cursor() @@ -1558,11 +1564,11 @@ class Storage: c.close() return row - def getEditTop3(self, page=1, amount=3, channel=None): + def getEditTop5(self, page=1, amount=5, channel=None): if page < 1: page = 1 if amount < 1: - amount = 3 + amount = 5 page -= 1 start = page * amount c = self.conn.cursor() @@ -1581,11 +1587,11 @@ class Storage: c.close() return rows - def getNotMyEditTop3(self, username, page=1, amount=3, channel=None): + def getNotMyEditTop5(self, username, page=1, amount=5, channel=None): if page < 1: page = 1 if amount < 1: - amount = 3 + amount = 5 page -= 1 start = page * amount c = self.conn.cursor() @@ -1606,11 +1612,11 @@ class Storage: c.close() return rows - def getMyEditTop3(self, username, page=1, amount=3, channel=None): + def getMyEditTop5(self, username, page=1, amount=5, channel=None): if page < 1: page = 1 if amount < 1: - amount = 3 + amount = 5 page -= 1 start = page * amount c = self.conn.cursor() @@ -3110,7 +3116,7 @@ class TriviaTime(callbacks.Plugin): delete = threadStorage.getDeleteById(num, channel) if delete: - if username == delete['username']: + if username == delete['username'] and self.isTriviaMod(hostmask, channel) == False: irc.reply('You cannot accept your own deletion request.') else: questionNumber = delete['line_num'] @@ -3304,7 +3310,10 @@ class TriviaTime(callbacks.Plugin): Parameter is optional, display up to that number. (eg 20 - display 11-20) Channel is only required when using the command outside of a channel. """ - num = max(num, 10) + if num is not None: + num = max(num, 10) + else: + num = 10 offset = num-9 dbLocation = self.registryValue('admin.db') threadStorage = Storage(dbLocation) @@ -3433,12 +3442,15 @@ class TriviaTime(callbacks.Plugin): count = threadStorage.countDeletes() else: count = threadStorage.countDeletes(channel) - pages = int(count / 3) + int(count % 3 > 0) - page = max(1, min(page, pages)) - if self.registryValue('general.globalstats'): - deletes = threadStorage.getDeleteTop3(page) + pages = int(count / 5) + int(count % 5 > 0) + if page is not None: + page = max(1, min(page, pages)) else: - deletes = threadStorage.getDeleteTop3(page, channel=channel) + page = 1 + if self.registryValue('general.globalstats'): + deletes = threadStorage.getDeleteTop5(page) + else: + deletes = threadStorage.getDeleteTop5(page, channel=channel) # Output list if count < 1: @@ -3472,12 +3484,15 @@ class TriviaTime(callbacks.Plugin): count = threadStorage.countEdits() else: count = threadStorage.countEdits(channel) - pages = int(count / 3) + int(count % 3 > 0) - page = max(1, min(page, pages)) - if self.registryValue('general.globalstats'): - edits = threadStorage.getEditTop3(page) + pages = int(count / 5) + int(count % 5 > 0) + if page is not None: + page = max(1, min(page, pages)) else: - edits = threadStorage.getEditTop3(page, channel=channel) + page = 1 + if self.registryValue('general.globalstats'): + edits = threadStorage.getEditTop5(page) + else: + edits = threadStorage.getEditTop5(page, channel=channel) # Output list if count < 1: @@ -3510,12 +3525,15 @@ class TriviaTime(callbacks.Plugin): count = threadStorage.countMyEdits(username) else: count = threadStorage.countMyEdits(username, channel) - pages = int(count / 3) + int(count % 3 > 0) - page = max(1, min(page, pages)) - if self.registryValue('general.globalstats'): - edits = threadStorage.getMyEditTop3(username, page) + pages = int(count / 5) + int(count % 5 > 0) + if page is not None: + page = max(1, min(page, pages)) else: - edits = threadStorage.getMyEditTop3(username, page, channel=channel) + page = 1 + if self.registryValue('general.globalstats'): + edits = threadStorage.getMyEditTop5(username, page) + else: + edits = threadStorage.getMyEditTop5(username, page, channel=channel) # Output list if count < 1: @@ -3548,12 +3566,15 @@ class TriviaTime(callbacks.Plugin): count = threadStorage.countNotMyEdits(username) else: count = threadStorage.countNotMyEdits(username, channel) - pages = int(count / 3) + int(count % 3 > 0) - page = max(1, min(page, pages)) - if self.registryValue('general.globalstats'): - edits = threadStorage.getNotMyEditTop3(username, page) + pages = int(count / 5) + int(count % 5 > 0) + if page is not None: + page = max(1, min(page, pages)) else: - edits = threadStorage.getNotMyEditTop3(username, page, channel=channel) + page = 1 + if self.registryValue('general.globalstats'): + edits = threadStorage.getNotMyEditTop5(username, page) + else: + edits = threadStorage.getNotMyEditTop5(username, page, channel=channel) # Output list if count < 1: @@ -3580,12 +3601,15 @@ class TriviaTime(callbacks.Plugin): count = threadStorage.countReports() else: count = threadStorage.countReports(channel) - pages = int(count / 3) + int(count % 3 > 0) - page = max(1, min(page, pages)) - if self.registryValue('general.globalstats'): - reports = threadStorage.getReportTop3(page) + pages = int(count / 5) + int(count % 5 > 0) + if page is not None: + page = max(1, min(page, pages)) else: - reports = threadStorage.getReportTop3(page, channel=channel) + page = 1 + if self.registryValue('general.globalstats'): + reports = threadStorage.getReportTop5(page) + else: + reports = threadStorage.getReportTop5(page, channel=channel) # Output list if count < 1: @@ -3617,12 +3641,15 @@ class TriviaTime(callbacks.Plugin): count = threadStorage.countTemporaryQuestions() else: count = threadStorage.countTemporaryQuestions(channel) - pages = int(count / 3) + int(count % 3 > 0) - page = max(1, min(page, pages)) - if self.registryValue('general.globalstats'): - q = threadStorage.getTemporaryQuestionTop3(page) + pages = int(count / 5) + int(count % 5 > 0) + if page is not None: + page = max(1, min(page, pages)) else: - q = threadStorage.getTemporaryQuestionTop3(page, channel=channel) + page = 1 + if self.registryValue('general.globalstats'): + q = threadStorage.getTemporaryQuestionTop5(page) + else: + q = threadStorage.getTemporaryQuestionTop5(page, channel=channel) # Output list if count < 1: @@ -3646,7 +3673,7 @@ class TriviaTime(callbacks.Plugin): threadStorage = Storage(dbLocation) totalUsersEver = threadStorage.getNumUser(channel) numActiveThisWeek = threadStorage.getNumActiveThisWeek(channel) - infoText = ' TriviaTime v1.3.2 by Trivialand on Freenode: https://github.com/tannn/TriviaTime ' + infoText = ' TriviaTime fork for #trivia on Snoonet: https://github.com/oddluck/limnoria-plugins' self.reply(irc, msg, infoText, prefixNick=False) infoText = '\x02 %d Users\x02 on scoreboard with \x02%d Active This Week\x02' % (totalUsersEver, numActiveThisWeek) self.reply(irc, msg, infoText, prefixNick=False) @@ -3692,18 +3719,26 @@ class TriviaTime(callbacks.Plugin): else: hasPoints = False infoList = ['%s\'s Stats: Points (answers)' % (self.addZeroWidthSpace(stat['username']))] - if rank['day'] > 0 or stat['points_day'] > 0 or stat['answer_day'] > 0: - hasPoints = True - infoList.append(' \x02Today:\x02 #%d %d (%d)' % (rank['day'], stat['points_day'], stat['answer_day'])) - if rank['week'] > 0 or stat['points_week'] > 0 or stat['answer_week'] > 0: - hasPoints = True - infoList.append(' \x02This Week:\x02 #%d %d (%d)' % (rank['week'], stat['points_week'], stat['answer_week'])) - if rank['month'] > 0 or stat['points_month'] > 0 or stat['answer_week'] > 0: - hasPoints = True - infoList.append(' \x02This Month:\x02 #%d %d (%d)' % (rank['month'], stat['points_month'], stat['answer_month'])) - if rank['year'] > 0 or stat['points_year'] > 0 or stat['answer_year'] > 0: - hasPoints = True - infoList.append(' \x02This Year:\x02 #%d %d (%d)' % (rank['year'], stat['points_year'], stat['answer_year'])) + if rank['day'] is not None and stat['points_day'] is not None and stat['answer_day'] is not None: + if rank['day'] > 0 or stat['points_day'] > 0 or stat['answer_day'] > 0: + hasPoints = True + infoList.append(' \x02Today:\x02 #%d %d (%d)' % (rank['day'], stat['points_day'], stat['answer_day'])) + if rank['week'] is not None and stat['points_week'] is not None and stat['answer_week'] is not None: + if rank['week'] > 0 or stat['points_week'] > 0 or stat['answer_week'] > 0: + hasPoints = True + infoList.append(' \x02This Week:\x02 #%d %d (%d)' % (rank['week'], stat['points_week'], stat['answer_week'])) + if rank['month'] is not None and stat['points_month'] is not None and stat['answer_month'] is not None: + if rank['month'] > 0 or stat['points_month'] > 0 or stat['answer_week'] > 0: + hasPoints = True + infoList.append(' \x02This Month:\x02 #%d %d (%d)' % (rank['month'], stat['points_month'], stat['answer_month'])) + if rank['year'] is not None and stat['points_year'] is not None and stat['answer_year'] is not None: + if rank['year'] > 0 or stat['points_year'] > 0 or stat['answer_year'] > 0: + hasPoints = True + infoList.append(' \x02This Year:\x02 #%d %d (%d)' % (rank['year'], stat['points_year'], stat['answer_year'])) + if rank['total'] is not None and stat['points_total'] is not None and stat['answer_total'] is not None: + if rank['total'] > 0 or stat['points_total'] > 0 or stat['answer_total'] > 0: + hasPoints = True + infoList.append(' \x02All Time:\x02 #%d %d (%d)' % (rank['total'], stat['points_total'], stat['answer_total'])) if not hasPoints: infoList = ['%s: You do not have any points.' % (username)] if not identified: @@ -3718,7 +3753,10 @@ class TriviaTime(callbacks.Plugin): Parameter is optional, display up to that number. (eg 20 - display 11-20) Channel is only required when using the command outside of a channel. """ - num = max(num, 10) + if num is not None: + num = max(num, 10) + else: + num = 10 offset = num-9 dbLocation = self.registryValue('admin.db') threadStorage = Storage(dbLocation) @@ -4016,7 +4054,7 @@ class TriviaTime(callbacks.Plugin): # Update skip count game.skipList.append(usernameCanonical) game.skipTimeoutList.append(usernameCanonical) - self.reply(irc, msg, '%s voted to skip this question.' % username, prefixNick=False) + self.reply(irc, msg, '%s voted to skip this question.' % username, (len(game.skipList), totalActive), prefixNick=False) skipPercent = len(game.skipList)/(totalActive*1.0) # Check if skip threshold has been reached @@ -4045,18 +4083,26 @@ class TriviaTime(callbacks.Plugin): else: hasPoints = False infoList = ['%s\'s Stats: Points (answers)' % (self.addZeroWidthSpace(stat['username']))] - if rank['day'] > 0 or stat['points_day'] > 0 or stat['answer_day'] > 0: - hasPoints = True - infoList.append(' \x02Today:\x02 #%d %d (%d)' % (rank['day'], stat['points_day'], stat['answer_day'])) - if rank['week'] > 0 or stat['points_week'] > 0 or stat['answer_week'] > 0: - hasPoints = True - infoList.append(' \x02This Week:\x02 #%d %d (%d)' % (rank['week'], stat['points_week'], stat['answer_week'])) - if rank['month'] > 0 or stat['points_month'] > 0 or stat['answer_month'] > 0: - hasPoints = True - infoList.append(' \x02This Month:\x02 #%d %d (%d)' % (rank['month'], stat['points_month'], stat['answer_month'])) - if rank['year'] > 0 or stat['points_year'] > 0 or stat['answer_year'] > 0: - hasPoints = True - infoList.append(' \x02This Year:\x02 #%d %d (%d)' % (rank['year'], stat['points_year'], stat['answer_year'])) + if rank['day'] is not None and stat['points_day'] is not None and stat['answer_day'] is not None: + if rank['day'] > 0 or stat['points_day'] > 0 or stat['answer_day'] > 0: + hasPoints = True + infoList.append(' \x02Today:\x02 #%d %d (%d)' % (rank['day'], stat['points_day'], stat['answer_day'])) + if rank['week'] is not None and stat['points_week'] is not None and stat['answer_week'] is not None: + if rank['week'] > 0 or stat['points_week'] > 0 or stat['answer_week'] > 0: + hasPoints = True + infoList.append(' \x02This Week:\x02 #%d %d (%d)' % (rank['week'], stat['points_week'], stat['answer_week'])) + if rank['month'] is not None and stat['points_month'] is not None and stat['answer_month'] is not None: + if rank['month'] > 0 or stat['points_month'] > 0 or stat['answer_month'] > 0: + hasPoints = True + infoList.append(' \x02This Month:\x02 #%d %d (%d)' % (rank['month'], stat['points_month'], stat['answer_month'])) + if rank['year'] is not None and stat['points_year'] is not None and stat['answer_year'] is not None: + if rank['year'] > 0 or stat['points_year'] > 0 or stat['answer_year'] > 0: + hasPoints = True + infoList.append(' \x02This Year:\x02 #%d %d (%d)' % (rank['year'], stat['points_year'], stat['answer_year'])) + if rank['total'] is not None and stat['points_total'] is not None and stat['answer_total'] is not None: + if rank['total'] > 0 or stat['points_total'] > 0 or stat['answer_total'] > 0: + hasPoints = True + infoList.append(' \x02All Time:\x02 #%d %d (%d)' % (rank['total'], stat['points_total'], stat['answer_total'])) if not hasPoints: infoList = ['%s: %s does not have any points.' % (msg.nick, username)] infoText = ''.join(infoList) @@ -4275,6 +4321,34 @@ class TriviaTime(callbacks.Plugin): self.reply(irc, msg, 'The current server time appears to be {0}'.format(timeStr), prefixNick=False) time = wrap(time) + def top(self, irc, msg, arg, channel, num): + """[] [] + Displays the top scores of all time. + Parameter is optional, display up to that number. (eg 20 - display 11-20) + Channel is only required when using the command outside of a channel. + """ + if num is not None: + num = max(num, 10) + else: + num = 10 + offset = num-9 + dbLocation = self.registryValue('admin.db') + threadStorage = Storage(dbLocation) + if self.registryValue('general.globalStats'): + tops = threadStorage.viewAllTimeTop10(None, num) + else: + tops = threadStorage.viewAllTimeTop10(channel, num) + + topsList = ['All Time Top {0}-{1} Players: '.format(offset, num)] + if tops: + for i in range(len(tops)): + topsList.append('\x02 #%d:\x02 %s %d ' % ((i+offset) , self.addZeroWidthSpace(tops[i]['username']), tops[i]['points'])) + else: + topsList.append('No players') + topsText = ''.join(topsList) + self.reply(irc, msg, topsText, prefixNick=False) + top = wrap(top, ['channel', optional('int')]) + def transferpoints(self, irc, msg, arg, channel, userfrom, userto): """[] Transfers all points and records from one user to another. @@ -4300,7 +4374,10 @@ class TriviaTime(callbacks.Plugin): Parameter is optional, display up to that number. (eg 20 - display 11-20) Channel is only required when using the command outside of a channel. """ - num = max(num, 10) + if num is not None: + num = max(num, 10) + else: + num = 10 offset = num-9 dbLocation = self.registryValue('admin.db') threadStorage = Storage(dbLocation) @@ -4325,7 +4402,10 @@ class TriviaTime(callbacks.Plugin): Parameter is optional, display up to that number. (eg 20 - display 11-20) Channel is only required when using the command outside of a channel. """ - num = max(num, 10) + if num is not None: + num = max(num, 10) + else: + num = 10 offset = num-9 dbLocation = self.registryValue('admin.db') threadStorage = Storage(dbLocation)