mirror of
https://gitlab.com/gpvkt/twitchtts.git
synced 2025-04-19 02:02:26 +02:00
Added !quickvote feature
This commit is contained in:
parent
b41723609a
commit
a65a2dcccb
4 changed files with 88 additions and 6 deletions
15
CHANGELOG.md
15
CHANGELOG.md
|
@ -2,12 +2,21 @@
|
|||
|
||||
All notable changes to this project will be documented in this file.
|
||||
|
||||
## [1.0.0] - 2022-08-11
|
||||
|
||||
Initial Release
|
||||
## [1.1.0] - unreleased
|
||||
|
||||
### Added
|
||||
|
||||
* `!quickvote` feature (see README.md for details)
|
||||
* `!ping` command added
|
||||
|
||||
### Changed
|
||||
|
||||
* The bot replies with a chat message when `!ton` or `!toff` is used
|
||||
|
||||
### Fixed
|
||||
|
||||
* Improved error handling
|
||||
|
||||
## [1.0.0] - 2022-08-11
|
||||
|
||||
Initial Release
|
||||
|
|
12
README.md
12
README.md
|
@ -57,6 +57,10 @@ messages:
|
|||
whitelist: "Sorry, you are not allowed to use TTS."
|
||||
ready: "TTS bot alpha ready!"
|
||||
says: "says"
|
||||
votestart: "Quickvote started. Send #yourchoice to participate."
|
||||
voteend: "Quickvote ended. The results are:"
|
||||
votenobody: "Nobody casted a vote. :("
|
||||
votes: "Votes"
|
||||
|
||||
log:
|
||||
level: "INFO"
|
||||
|
@ -100,6 +104,10 @@ whitelist:
|
|||
* `whitelist`: The bots reply if `whitelist` is set and user isn't on the list.
|
||||
* `ready`: The bots init message
|
||||
* `says`: Prefix to add between username and message
|
||||
* `votestart`: Message when a quickvote is started.
|
||||
* `voteend`: Message if a quickvote ends.
|
||||
* `votenobody`: Message if quickvote ends, but nobody has voted.
|
||||
* `votes`: Suffix to vote count.
|
||||
|
||||
##### log
|
||||
|
||||
|
@ -144,6 +152,10 @@ Additional commands (broadcaster and mods only) are:
|
|||
* `!dtts <username>`: Disable TTS for the given user
|
||||
* `!ptts <username>`: Allow TTS for the given user
|
||||
|
||||
### Additional features
|
||||
|
||||
The bot also contains a `!quickvote` feature. If a broadcaster or moderator send the `!quickvote` command a vote will be started (or a already running vote will be ended). After a quickvote has been started your community can casts votes by sending a chat message starting with `#`. You can include a message after `!quickvote` (e.g. `!quickvote Is pizza hawaii any good? #yes/#no`). If you do so, this message will be repeated every 60 seconds, so everyone keeps in mind, that a vote is still active.
|
||||
|
||||
## Build
|
||||
|
||||
If you prefer to build your own `tts.exe` instead of using the shipped one, you can do as follows:
|
||||
|
|
|
@ -23,6 +23,10 @@ messages:
|
|||
modonly: "Sorry, TTS is a mod-only feature."
|
||||
ready: "TTS bot alpha ready!"
|
||||
says: "says"
|
||||
votestart: "Quickvote started. Send #yourchoice to participate."
|
||||
voteend: "Quickvote ended. The results are:"
|
||||
votenobody: "Nobody casted a vote. :("
|
||||
votes: "Votes"
|
||||
|
||||
log:
|
||||
level: "INFO"
|
||||
|
|
63
tts.py
63
tts.py
|
@ -31,6 +31,7 @@ import socketserver
|
|||
from threading import Thread
|
||||
from http.server import BaseHTTPRequestHandler
|
||||
from urllib.parse import parse_qs
|
||||
from collections import Counter
|
||||
|
||||
class IRC:
|
||||
irc = socket.socket()
|
||||
|
@ -40,6 +41,10 @@ class IRC:
|
|||
self.tts_denied = []
|
||||
self.tts_allowed = []
|
||||
self.tts_status = True
|
||||
self.quickvote = False
|
||||
self.votemsg = False
|
||||
self.poll = {}
|
||||
self.pollcount = 0
|
||||
|
||||
if 'WHITELIST_USER' in conf:
|
||||
self.tts_allowed = conf['WHITELIST_USER']
|
||||
|
@ -63,9 +68,9 @@ class IRC:
|
|||
try:
|
||||
self.irc.send(bytes("JOIN " + channel + "\r\n", "UTF-8"))
|
||||
except ConnectionResetError:
|
||||
logging.warn('JOIN was refused, will try again in 5 seconds.')
|
||||
logging.warning('JOIN was refused, will try again in 5 seconds.')
|
||||
time.sleep(5)
|
||||
logging.warn('Please check your credentials, if this error persists.')
|
||||
logging.warning('Please check your credentials, if this error persists.')
|
||||
self.irc.send(bytes("JOIN " + channel + "\r\n", "UTF-8"))
|
||||
|
||||
def sendpriv(self, channel, user, msg):
|
||||
|
@ -171,11 +176,48 @@ class IRC:
|
|||
return True
|
||||
|
||||
if msg.startswith('!ping'):
|
||||
logging.debug('Ping check received.')
|
||||
logging.debug("Ping check received.")
|
||||
self.sendpriv(conf['IRC_CHANNEL'], "@"+str(user), "Pong!")
|
||||
|
||||
return True
|
||||
|
||||
if msg.startswith('!quickvote'):
|
||||
logging.info("!quickvote command detected")
|
||||
if self.quickvote:
|
||||
logging.debug('Quickvote stopped')
|
||||
|
||||
if self.pollcount == 0:
|
||||
logging.info("Nobody voted")
|
||||
self.sendpriv(conf['IRC_CHANNEL'], "@chat", conf['MESSAGE']['VOTEEND'])
|
||||
self.sendpriv(conf['IRC_CHANNEL'], "*", conf['MESSAGE']['VOTENOBODY'])
|
||||
self.quickvote = False
|
||||
self.poll = {}
|
||||
return False
|
||||
|
||||
logging.info("Counting votes")
|
||||
count = 0
|
||||
count = Counter(self.poll.values()).most_common(5)
|
||||
self.sendpriv(conf['IRC_CHANNEL'], "@chat", conf['MESSAGE']['VOTEEND'])
|
||||
|
||||
logging.debug(count)
|
||||
|
||||
for key, value in count:
|
||||
self.sendpriv(conf['IRC_CHANNEL'], "*", str(key)+" ("+str(value)+ " "+ conf['MESSAGE']['VOTES'] + ")")
|
||||
|
||||
self.quickvote = False
|
||||
self.poll = {}
|
||||
self.pollcount = 0
|
||||
return True
|
||||
else:
|
||||
logging.debug('Quickvote started')
|
||||
self.quickvote = True
|
||||
self.votemsg = resp.split('!quickvote', 1)[1].strip()
|
||||
if self.votemsg:
|
||||
self.sendpriv(conf['IRC_CHANNEL'], "@chat", conf['MESSAGE']['VOTESTART'] + " (" + str(self.votemsg) + ")")
|
||||
else:
|
||||
self.sendpriv(conf['IRC_CHANNEL'], "@chat", conf['MESSAGE']['VOTESTART'])
|
||||
return True
|
||||
|
||||
if msg.startswith('!ptts'):
|
||||
logging.debug("!ptts command detected")
|
||||
user = msg.replace('!ptts', '').strip().lower()
|
||||
|
@ -193,6 +235,12 @@ class IRC:
|
|||
|
||||
return True
|
||||
|
||||
if msg.startswith('#') and self.quickvote == True:
|
||||
logging.info('Quickvote: Cast detected')
|
||||
self.pollcount += 1
|
||||
self.poll[user] = msg.lower()
|
||||
logging.debug(self.poll)
|
||||
|
||||
if msg.startswith('!toff'):
|
||||
logging.info('TTS is now turned off')
|
||||
msg_queue.clear()
|
||||
|
@ -398,6 +446,11 @@ def load_config():
|
|||
conf['MESSAGE']['WHITELISTONLY'] = cfg['messages']['whitelist'] or False
|
||||
conf['MESSAGE']['SAYS'] = cfg['messages']['says'] or "says"
|
||||
|
||||
conf['MESSAGE']['VOTESTART'] = cfg['messages']['votestart'] or "Quickvote started. Send #yourchoice to participate."
|
||||
conf['MESSAGE']['VOTEEND'] = cfg['messages']['voteend'] or "Quickvote ended. The results are:"
|
||||
conf['MESSAGE']['VOTENOBODY'] = cfg['messages']['votenobody'] or "Nobody casted a vote. :("
|
||||
conf['MESSAGE']['VOTES'] = cfg['messages']['votes'] or "Stimmen"
|
||||
|
||||
conf['USERMAP'] = cfg['usermapping'] or []
|
||||
|
||||
if 'whitelist' in cfg:
|
||||
|
@ -474,6 +527,10 @@ def main():
|
|||
conf = load_config()
|
||||
lastreload = datetime.datetime.now()
|
||||
|
||||
if irc.quickvote and irc.votemsg:
|
||||
logging.info('Quickvote is active')
|
||||
irc.sendpriv(conf['IRC_CHANNEL'], "@chat", conf['MESSAGE']['VOTESTART'] + " (" + str(irc.votemsg) + ")")
|
||||
|
||||
logging.debug('Raw message queue:')
|
||||
logging.debug(msg_queue_raw)
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue