diff --git a/commands/implemented/command_roll.py b/commands/implemented/command_roll.py index 97bcfbb..48a87cb 100644 --- a/commands/implemented/command_roll.py +++ b/commands/implemented/command_roll.py @@ -18,7 +18,7 @@ class CommandRoll(AbstractCommand, metaclass=ABCMeta): #twitch_message.chat.send("test acknowledged") diceRoll: str = "" - twitch_message.chat.send("Rolling Dice...") + bot.send_message("Rolling Dice...") print("Rolling Dice...") temp_preParsedMessage = twitch_message.text.split("+") @@ -63,4 +63,4 @@ class CommandRoll(AbstractCommand, metaclass=ABCMeta): diceRoll = "@" + twitch_message.sender + " rolled: " + diceRoll print(diceRoll) - twitch_message.chat.send(diceRoll) \ No newline at end of file + bot.send_message(diceRoll) \ No newline at end of file diff --git a/commands/implemented/command_test.py b/commands/implemented/command_test.py index d6fb5a5..1432e14 100644 --- a/commands/implemented/command_test.py +++ b/commands/implemented/command_test.py @@ -14,4 +14,4 @@ class CommandTest(AbstractCommand, metaclass=ABCMeta): def do_command(self, bot, twitch_message): print("!test Detected") - twitch_message.chat.send("test acknowledged") + bot.send_message("testing acknowledged") diff --git a/commands/implemented/command_tts.py b/commands/implemented/command_tts.py index 4392cc5..305e1cf 100644 --- a/commands/implemented/command_tts.py +++ b/commands/implemented/command_tts.py @@ -13,8 +13,10 @@ class CommandTTS(AbstractCommand, metaclass=ABCMeta): def do_command(self, bot, twitch_message): args = self.get_args(twitch_message.text) if args[1] == "start": - bot.send_message("tts activated on #%s" % twitch_message.channel) - bot.tts_enabled = True + if twitch_message.sender.lower() == twitch_message.channel: + bot.send_message("tts activated on #%s" % twitch_message.channel) + bot.tts_enabled = True elif args[1] == "stop": - bot.send_message("tts deactivated") - bot.tts_enabled = False + if twitch_message.sender.lower() == twitch_message.channel: + bot.send_message("tts activated on #%s" % twitch_message.channel) + bot.tts_enabled = False diff --git a/cooldowns.py b/cooldowns.py new file mode 100644 index 0000000..68b1431 --- /dev/null +++ b/cooldowns.py @@ -0,0 +1,121 @@ +import random +import re + +import datetime +from datetime import timedelta + +import time +from time import sleep + +class Cooldown_Action: + def __init__(self): + self.tag:str = "" + self.time = datetime.datetime.now() + +class Cooldown: + def __init__(self): + self.cooldownName:str = "" + self.cooldownActionLimit:int = 0 + self.cooldownDuration:int = 0 #Seconds + + self.actionList:list = [] + + def setupCooldown(self, name, limit, duration): + self.cooldownName = name + self.cooldownActionLimit = limit + self.cooldownDuration = duration + +class Cooldown_Module: + def __init__(self): + super().__init__() + self.cooldownList:list = [] + + def setupCooldown(self, name, limit, duration): + newCD:Cooldown = Cooldown() + newCD.setupCooldown(name, limit, duration) + self.cooldownList.append(newCD) + + + def getCooldown(self, name:str): + returnCD:bool = False + for cd in self.cooldownList: + if cd.cooldownName == name: + returnCD = True + return cd + if returnCD == False: + return None + + def isCooldownActive(self, name:str): + isCooldownActivated:bool = False + + selectedCooldown:Cooldown = self.getCooldown(name) + + if selectedCooldown == None: + return None + + timenow = datetime.datetime.now() + + if len(selectedCooldown.actionList) >= selectedCooldown.cooldownActionLimit: + actionCount = len(selectedCooldown.actionList) + + maxTmpIndex = actionCount - selectedCooldown.cooldownActionLimit + maxRecentAction:Cooldown_Action = selectedCooldown.actionList[maxTmpIndex] + + timeDiff = timenow - maxRecentAction.time + maxTimeAllowed = timedelta(seconds = selectedCooldown.cooldownDuration) + + if timeDiff < maxTimeAllowed: + isCooldownActivated = True + + return isCooldownActivated + + def actionTrigger(self, name:str = "", tag:str = ""): + newAction = Cooldown_Action() + newAction.tag = tag + targetCD = self.getCooldown(name) + if targetCD != None: + targetCD.actionList.append(newAction) + +if __name__ == "__main__": + testCD = Cooldowns_Module() + cdName = "test" + testCD.setupCooldown(cdName, 20, 2) + + print("CD Test 0: ") + for x in range(20): + testCD.actionTrigger("cdName") + sleep(0) + print(testCD.isCooldownActive("cdName")) + print("//Test Done//") + sleep(2) + + print("CD Test 1: ") + for x in range(20): + testCD.actionTrigger(cdName) + sleep(0) + print(testCD.isCooldownActive("test")) + print("//Test Done//") + sleep(2) + + print("CD Test 2: ") + for x in range(10): + testCD.actionTrigger(cdName) + sleep(0) + print(testCD.isCooldownActive(cdName)) + print("//Test Done//") + sleep(2) + + print("CD Test 3: ") + for x in range(20): + testCD.actionTrigger(cdName) + sleep(0.05) + print(testCD.isCooldownActive(cdName)) + print("//Test Done//") + sleep(2) + + print("CD Test 4: ") + for x in range(20): + testCD.actionTrigger(cdName) + sleep(0.6) + print(testCD.isCooldownActive(cdName)) + print("//Test Done//") \ No newline at end of file diff --git a/twitch_script.py b/twitch_script.py index 1f2b8f3..bf4ef2c 100644 --- a/twitch_script.py +++ b/twitch_script.py @@ -1,3 +1,4 @@ +from typing import Sequence import random import re @@ -12,6 +13,7 @@ import commands.loader as command_loader import credentials from commands.command_base import AbstractCommand +from cooldowns import Cooldown_Module class Twitch_Module(): def __init__(self): @@ -30,6 +32,11 @@ class Twitch_Module(): self._urlMatcher = re.compile( "(https?:(/{1,3}|[a-z0-9%])|[a-z0-9.-]+[.](com|net|org|edu|gov|mil|aero|asia|biz|cat|coop|info|int|jobs|mobi|museum|name|post|pro|tel|travel|xxx|ac|ad|ae|af|ag|ai|al|am|an|ao|aq|ar|as|at|au|aw|ax|az|ba|bb|bd|be|bf|bg|bh|bi|bj|bm|bn|bo|br|bs|bt|bv|bw|by|bz|ca|cc|cd|cf|cg|ch|ci|ck|cl|cm|cn|co|cr|cs|cu|cv|cx|cy|cz|dd|de|dj|dk|dm|do|dz|ec|ee|eg|eh|er|es|et|eu|fi|fj|fk|fm|fo|fr|ga|gb|gd|ge|gf|gg|gh|gi|gl|gm|gn|gp|gq|gr|gs|gt|gu|gw|gy|hk|hm|hn|hr|ht|hu|id|ie|il|im|in|io|iq|ir|is|it|je|jm|jo|jp|ke|kg|kh|ki|km|kn|kp|kr|kw|ky|kz|la|lb|lc|li|lk|lr|ls|lt|lu|lv|ly|ma|mc|md|me|mg|mh|mk|ml|mm|mn|mo|mp|mq|mr|ms|mt|mu|mv|mw|mx|my|mz|na|nc|ne|nf|ng|ni|nl|no|np|nr|nu|nz|om|pa|pe|pf|pg|ph|pk|pl|pm|pn|pr|ps|pt|pw|py|qa|re|ro|rs|ru|rw|sa|sb|sc|sd|se|sg|sh|si|sj|Ja|sk|sl|sm|sn|so|sr|ss|st|su|sv|sx|sy|sz|tc|td|tf|tg|th|tj|tk|tl|tm|tn|to|tp|tr|tt|tv|tw|tz|ua|ug|uk|us|uy|uz|va|vc|ve|vg|vi|vn|vu|wf|ws|ye|yt|yu|za|zm|zw))") + # Default Twitch Chat limit is 20 per 30 seconds + # If Mod or Op, Twitch Chat limit is 100 per 30 seconds + self.twitchChat_cooldown:Cooldown_Module = Cooldown_Module() + self.twitchChat_cooldown.setupCooldown("twitchChat", 20, 32) + def join_channel(self, credential: credentials.Twitch_Credential, channel_name:str): channel_name = "#" + channel_name print("Connecting to Channel: " + channel_name) @@ -53,7 +60,9 @@ class Twitch_Module(): self.chat.irc.socket.close() def send_message(self, message): - self.chat.send(message) + if self.twitchChat_cooldown.isCooldownActive("twitchChat") == False: + self.chat.send(message) + self.twitchChat_cooldown.actionTrigger("twitchChat") def send_whisper(self, user, message): pass @@ -64,8 +73,10 @@ class Twitch_Module(): if message.channel == "thecuriousnerd": if not self.isSenderBot(message): - if message.sender.lower() == "thecuriousnerd": + if self.twitchChat_cooldown.isCooldownActive("twitchChat") == False: self.eval_commands(message) + #elif message.channel == message.sender: + #self.eval_commands(message) self.tts_message(message) def eval_commands(self, message: twitch.chat.Message): @@ -74,7 +85,7 @@ class Twitch_Module(): #first_space_idx = message.text.index(' ') # This fixes a error where if you send a command without arguments it fails because - # it cant find the substring. + # it cant find the substring. if message.text.find(" ") != -1: first_space_idx = message.text.index(' ') else: @@ -158,4 +169,4 @@ if __name__ == "__main__": credentials_manager.load_credentials() testModule.twitchCredential = credentials_manager.find_Twitch_Credential("praxis_bot") testModule.dbCredential = credentials_manager.find_DB_Credential("praxis_bot") - testModule.join_channel(None ,"thecuriousnerd") \ No newline at end of file + testModule.join_channel(None ,"thecuriousnerd")