def backseatmessage(s, message): global bstimer global bsmessagestr global backseating messageparts = message.split(" ") if messageparts[1] == "on": if not backseating: backseating = True bstimer = threading.Timer(900, bsmessage, [s]) bstimer.start() send_message(s, "Backseating message enabled.") else: send_message(s, "BSM already enabled.") elif messageparts[1] == "off": if backseating: backseating = False bstimer.cancel() send_message(s, "Backseating message disabled.") else: send_message(s, "BSM already off.") elif messageparts[1] == "set": try: newbsmessage = " ".join(messageparts[2:]) bsmessagestr = newbsmessage with open( f'{os.path.dirname(os.path.dirname(__file__))}/{folder}/files/Backseatmessage.txt', 'w') as f: f.write(bsmessagestr) send_message(s, "Backseat message changed.") except Exception as errormsg: errorlog(errormsg, 'backseatmessage/set()', message) send_message( s, "There was an error chaning the backseatmessage. Please try again." )
def nopong(): # Function to restart the bot in case of connection lost print(">>>Connection lost, restarting bot!") errorlog("Connection lost, bot restarted", "nopong", '') os.execv( sys.executable, [sys.executable, f"{os.path.dirname(__file__)}/{FOLDER}/{FOLDER}.py"] + sys.argv)
def remove_question(s, message): global questions try: messageparts = message.split(" ") del questions[messageparts[1]] qcounter = 1 with open( f"{os.path.dirname(os.path.dirname(__file__))}/{folder}/files/Questions.txt", 'w') as f: for key, val in questions.items(): f.write("%s:%s\n" % (qcounter, val)) qcounter += 1 questions = {} with open( f'{os.path.dirname(os.path.dirname(__file__))}/{folder}/files/Questions.txt' ) as f: for line in f: split = line.split(":") questions[split[0]] = split[1].rstrip('\n') send_message(s, "Question %s removed!" % messageparts[1]) except KeyError: send_message(s, f'Question number {messageparts[1]} does not exist.') except Exception as errormsg: errorlog(errormsg, "Questions/remove_question()", message)
def mod(s, message): messagesplit = message.split(" ") searchterm = "+".join(messagesplit[1:]) try: r = requests.get( f'https://steamcommunity.com/workshop/browse/?appid=294100&searchtext={searchterm}&childpublishedfileid=0&browsesort=textsearch§ion=items&requiredtags[]=Mod' ) webpage = r.text soup = BeautifulSoup(webpage, "html.parser") # for item in soup.find_all(re.compile("SharedFileBindMouseHover\(.+({.+})")): for item in soup.find_all("script"): itemtext = re.sub('[\\r\\t\\n]', '', item.text) if 'SharedFileBindMouseHover' in itemtext: item = re.search('({.*})', itemtext) jsonitem = json.loads(item.group(1)) modtitle = jsonitem['title'] modid = jsonitem['id'] break try: send_message( s, f'Found the mod: {modtitle} https://steamcommunity.com/sharedfiles/filedetails/?id={modid}' ) except: send_message(s, "No mods found.") except Exception as errormsg: errorlog(errormsg, "ModSearch()", "")
def send_message(s, message): try: s.send(b"PRIVMSG #%s :%s\r\n" % (CHANNEL, message.encode())) print(">>BOT : " + message) logger(">>BOT", message, False, True) except Exception as errormsg: errorlog(errormsg, "Send_message", message)
def func_deaths(s, message, game, ismod): arguments = message.split(" ") cooldown_time = 0 try: if len(arguments) > 3 and arguments[1] in ['add', 'set', 'remove']: game = " ".join(arguments[3:]).lower() if arguments[1] == "list": send_message(s, "Current games are: %s" % ", ".join(list(deaths.keys()))) cooldown_time = 10 elif arguments[1] == "add" and ismod: if game in deaths: deaths[game] += int(arguments[2]) else: deaths[game] = int(arguments[2]) send_message(s, "New death counter for %s is now: %s" % (game, deaths[game])) cooldown_time = 5 elif arguments[1] == "set" and ismod: deaths[game] = int(arguments[2]) send_message(s, "Deaths for %s set to %s" % (game, deaths[game])) cooldown_time = 5 elif arguments[1] == "remove" and ismod: if deaths[game] - int(arguments[2]) < 0: send_message(s, "Deaths can't be negative. Current deaths: %s" % deaths[game]) elif game in deaths: deaths[game] -= int(arguments[2]) send_message(s, "New death counter for %s is now: %s" % (game, deaths[game])) else: send_message(s, "There are no deaths (yet) for %s" % game) cooldown_time = 5 elif " ".join(arguments[1:]).lower() in deaths: game = " ".join(arguments[1:]).lower() send_message(s, "Deaths in %s: %d!" % (game, deaths[game])) cooldown_time = 20 else: send_message(s, "Command \"!deaths %s\" not recognised or " "no deaths yet for this game." % " ".join(arguments[1:])) cooldown_time = 10 except IndexError: if game in deaths: send_message(s, "Deaths in %s: %d!" % (game, deaths[game])) else: send_message(s, "There are no deaths (yet) for %s" % game) cooldown_time = 20 except KeyError: send_message(s, "There are no deaths (yet) for %s" % game) cooldown_time = 20 except Exception as errormsg: errorlog(errormsg, "!deaths", message) send_message(s, "Something went wrong. Please check your command.") cooldown_time = 5 finally: with open(f'{os.path.dirname(os.path.dirname(__file__))}/{folder}/files/Deaths.txt', 'w') as f: for key, value in deaths.items(): f.write("%s:%s\n" % (key, value)) return cooldown_time
def clearsuggestions(s): try: with open(f'{os.path.dirname(os.path.dirname(__file__))}/{folder}/files/SongSuggestions.txt', 'w') as f: f.write("") send_message(s, "List cleared!") except Exception as errormsg: send_message(s, "There was an error adding this. Please try again!") errorlog(errormsg, "SongSuggestions/clearsuggestions()", "")
def load_followergoals(folder): global goals goals = [] try: with open(f'{os.path.dirname(os.path.dirname(__file__))}/{folder}/files/Goals.txt', 'r') as f: for line in f: goals.append(line) except Exception as errormsg: errorlog(errormsg, "load_followergoals()", '')
def unshorten(s, shorturl): try: url = f'https://unshorten.me/json/https://{shorturl}' r = requests.get(url).json() longurl = r["resolved_url"] if shorturl not in longurl and longurl != "": send_message(s, f"This link expands to: {longurl}") except Exception as errormsg: errorlog(errormsg, "unshorten()", "")
def bsmessage(s): global bstimer if backseating: try: bstimer = threading.Timer(900, bsmessage, [s]) bstimer.start() send_message(s, bsmessagestr) except Exception as errormsg: errorlog(errormsg, "Backseatmessage()", '')
def last_quote(s): try: quoteindex = len(quotes) quote = quotes[str(quoteindex)] send_message(s, "Quote %s: %s" % (quoteindex, quote)) except Exception as errormsg: errorlog(errormsg, "Quotes/removequote()", "") send_message( s, "There was an error retrieving the last quote. Error logged.")
def logline(line): # Debug setting to save the raw data recieved to a file try: line = unidecode(line) with open( f"{os.path.dirname(os.path.dirname(__file__))}/{FOLDER}/files/chatlogs/raw-" + time.strftime("%d-%m-%Y") + ".txt", 'a+') as f: f.write("[%s] %s\n" % (str(time.strftime("%H:%M:%S")), line)) except Exception as errormsg: errorlog(errormsg, "logline()", line)
def clearbets(s): global bets global timers try: bets = {} timers = {} send_message(s, "Bets cleared!") except Exception as errormsg: send_message(s, "Error clearing the bets. Error logged.") errorlog(errormsg, 'Bonertimer/clearbets()', '')
def mybet(s, displayname): try: if bets.get(displayname): send_message( s, displayname + " your bet is: " + str(bets.get(displayname)) + " minutes!") else: send_message(s, "No bet registered!") except Exception as errormsg: send_message(s, "There was an error showing your bet!") errorlog(errormsg, 'Bonertimer/mybet()', '')
def get_quote(s, message): try: if quotes: if message == "!quote": randomindex = random.randint(1, len(quotes)) randomquote = quotes[str(randomindex)] send_message(s, "Quote %s: %s" % (randomindex, randomquote)) elif "!quote" in message: quotesplit = message.split(" ") argument = quotesplit[1] if argument == "list": send_message( s, f"Quotelist can be found here: http://www.bastixx.nl/twitch/{folder}/quotes.php" ) else: try: int(argument) quoteindex = message.split(" ")[1] quote = quotes[quoteindex] send_message(s, "Quote %s: %s" % (quoteindex, quote)) except KeyError: send_message(s, "This quote does not exist.") except ValueError: quotes_temp = {} for key, value in quotes.items(): if argument.lower() in value.lower(): quotes_temp[key] = value if len(quotes_temp) == 0: send_message(s, "No quotes found.") elif len(quotes_temp) == 1: for key, value in quotes_temp.items(): send_message(s, "Quote %s: %s" % (key, value)) else: keylist = [] for key in quotes_temp: keylist.append(key) randomindex = random.choice(keylist) randomquote = quotes_temp[str(randomindex)] send_message( s, "Quote %s: %s" % (randomindex, randomquote)) except Exception as errormsg: errorlog(errormsg, "Quotes/quote()", message) send_message( s, "Something went wrong, check your command.") else: send_message(s, "No quotes yet!") except IndexError: send_message(s, "Error finding your searchterms. Check your command.") except Exception as errormsg: errorlog(errormsg, "Quotes/quote()", message) send_message(s, "Something went wrong, check your command.")
def question(s, message): try: if questions: randomindex = random.randint(1, len(questions)) randomquestion = questions[str(randomindex)] send_message(s, "%s: %s" % (randomindex, randomquestion)) else: send_message(s, "No questions yet!") except Exception as errormsg: errorlog(errormsg, "Question/question()", message) send_message(s, "Something went wrong, check your command.")
def followergoal(s, channel_id, channel, client_id): try: url = f'https://api.twitch.tv/helix/users/follows?to_id={channel_id}' headers = {'Client-ID': client_id, 'Accept': 'application/vnd.twitchtv.v5+json'} r = requests.get(url, headers=headers).json() total = r["total"] total = '250' if int(total) % 250 == 0 and total not in goals: send_message(s, f"@{channel.decode()} congrats on {total} followers!") goals.append(total) except Exception as errormsg: errorlog(errormsg, "followergoals()", "")
def roulette(displayname, s): try: randint = random.randint(1, 6) send_message(s, "%s spins the gun and pulls the trigger.." % displayname) time.sleep(1) if randint == 1: send_message(s, "The gun fires and %s drops dead to the ground!" % displayname) send_message(s, "/timeout %s 1" % displayname) else: send_message(s, "A CLICK can be heard as nothing happends. %s lives!" % displayname) except exception as errormsg: errorlog(errormsg, "roulette()", '')
def currentboner(s): try: with open( f"{os.path.dirname(os.path.dirname(__file__))}/{folder}/files/Titleholder.txt", "r") as f: titleholder = f.read() send_message( s, "The current owner of the title \"Broken Boner\" is: " + titleholder + "!") except Exception as errormsg: errorlog(errormsg, 'Bonertimer/currentboner()', '') send_message(s, "Error reading current boner")
def dead(s, game): try: if game in deaths: deaths[game] += 1 else: deaths[game] = 1 send_message(s, "A new death! Deathcount: %d!" % deaths[game]) with open(f'{os.path.dirname(os.path.dirname(__file__))}/{folder}/files/Deaths.txt', 'w') as f: for key, value in deaths.items(): f.write("%s:%s\n" % (key, value)) except Exception as errormsg: send_message(s, "A error occured. Please try again.") errorlog(errormsg, "!dead", '')
def addending(s, message): try: keyword = "!addending " newending = message[message.index(keyword) + len(keyword):] with open( f"{os.path.dirname(os.path.dirname(__file__))}/{folder}/files/Endings.txt", "a") as f: f.write(newending + "\n") send_message(s, "Ending added to the list!") except Exception as errormsg: send_message( s, "There was an error registering your text. Please try again!") errorlog(errormsg, 'Bonertimer/addending()', message)
def timer(s): try: if timeractive: timenow = datetime.time(datetime.now()) timer = datetime.combine(date.today(), timenow) - datetime.combine( date.today(), starttime) timer = str(timer).split('.')[0] timersplit = timer.split(':') endtime = ":".join(timersplit) send_message(s, "Fid has been alive for: " + endtime) else: send_message(s, "There is currently no timer active!") except Exception as errormsg: errorlog(errormsg, "BonerTimer/timer()", '')
def resettimer(s): global timeractive global betsopen global timers try: timeractive = False betsopen = True for t in list(timers.values()): t.cancel() time.sleep(1) timers = {} send_message(s, "Timer reset. Bets are now open again!") except Exception as errormsg: errorlog(errormsg, "BonerTimer/resettimer()", '')
def add_question(s, message): global questions try: keyword = "!addquestion " newquestion = message[message.index(keyword) + len(keyword):] questions[str(len(questions) + 1)] = newquestion with open( f"{os.path.dirname(os.path.dirname(__file__))}/{folder}/files/Questions.txt", 'a') as f: f.write("%s:%s\n" % (len(questions), newquestion)) send_message(s, "question %d added!" % len(questions)) except Exception as errormsg: send_message( s, "There was an error adding this question. Please try again!") errorlog(errormsg, "Questions/add_question()", message)
def suggest(s, message): try: keyword = "!suggest " suggestion = message[message.index(keyword) + len(keyword):] wrongchars = ['<', '>', '{', '}', '(', ')', '#', '%', '*', '\:', "\"", "|"] for elem in wrongchars: if elem in suggestion: suggestion = suggestion.replace(elem, "") with open(f'{os.path.dirname(os.path.dirname(__file__))}/{folder}/files/SongSuggestions.txt', 'a') as f: f.write(suggestion + "\n") send_message(s, "Song suggestion registered!") except Exception as errormsg: send_message(s, "There was an error adding this. Please try again!") errorlog(errormsg, "SongSuggestions/suggest()", message)
def announcer(s, displayname, bettime): global bets global timers try: try: ending = random.choice(endings) except: ending = "" send_message( s, "%s's time has come with %s minutes! %s" % (displayname, bettime, ending)) # bets.pop(displayname) timers.pop(displayname) except Exception as errormsg: errorlog(errormsg, "Announcer()", '')
def removebet(s, message): global bets global timers try: rembet = message.split(" ")[1] try: if all(i.isdigit() for i in rembet): if int(rembet) in list(bets.values()): if list(bets.values()).count(int(rembet)) > 1: userbets = [] index = 0 for i in list(bets.values()): if int(rembet) == i: userbets.append(list(bets.keys())[index]) index += 1 send_message( s, "Found more than one bet of " + rembet + " by these users: " + str(userbets)) else: rembet = list(bets.keys())[list(bets.values()).index( int(rembet))] del bets[rembet] del timers[rembet] send_message( s, "Bet for " + rembet + " removed from pool.") else: raise Exception else: if rembet in list(bets.keys()): del bets[rembet] del timers[rembet] send_message(s, "Bet for " + rembet + " removed from pool") else: raise Exception except Exception: send_message(s, "There are no bets with this name or value.") else: with open( f'{os.path.dirname(os.path.dirname(__file__))}/{folder}/files/Bets.txt', 'w') as f: for key in bets: f.write(key + ":" + str(bets[key]) + "\n") except Exception as errormsg: send_message(s, "Error removing user from current pool.") errorlog(errormsg, 'Bonertimer/removebet()', message)
def fidwins(s): global timeractive global timers global bets try: if timeractive: timeractive = False for t in list(timers.values()): t.cancel() time.sleep(1) timers = {} with open( f"{os.path.dirname(os.path.dirname(__file__))}/{folder}/files/Titleholder.txt", "w") as f: f.write("FideliasFK") timenow = datetime.time(datetime.now()) timer = datetime.combine(date.today(), timenow) - datetime.combine( date.today(), starttime) endtime = str(timer).split(':')[1] if str(timer).split(':')[0] == '1': endtime += (int(endtime) + 60) if str(timer).split(':')[0] == '2': endtime += (int(endtime) + 120) send_message(s, "The timer is on " + endtime + " minute(s)!") send_message( s, "No boners have been broken this round. The winner is FideliasFK!" ) else: send_message(s, "There is no timer active!") except Exception as errormsg: send_message(s, "Error lettting fid win.") errorlog(errormsg, 'Bonertimer/fidwins', '') else: with open( f'{os.path.dirname(os.path.dirname(__file__))}/{folder}/files/PrevBets.txt', 'a+') as f: f.write("\n" + "Bets ended on: " + str(time.strftime("%x")) + " " + str(time.strftime("%X")) + "\n") f.write("Endtime: %s minutes\n" % endtime) for key in bets: f.write(key + ":" + str(bets[key]) + "\n") bets = {} with open( f"{os.path.dirname(os.path.dirname(__file__))}/{folder}/files/Bets.txt", 'w') as f: f.write('')
def logger(displayname, message, issub, ismod): sub = "" mod = "" if issub: sub = "|SUB" if ismod: mod = "|MOD" try: message = unidecode(message) with open( f"{os.path.dirname(os.path.dirname(__file__))}/{folder}/files/chatlogs/" + time.strftime("%d-%m-%Y") + ".txt", 'a+') as f: f.write("[%s] %s: %s %s%s\n" % (str( time.strftime("%H:%M:%S")), displayname, message, sub, mod)) except Exception as errormsg: errorlog(errormsg, "Logger", message)
def paddle(s, displayname, message): try: messagesplit = message.split(" ") randint = random.randint(1, 20) if randint == 1: send_message(s, "/timeout %s 5 Get paddled!" % messagesplit[1]) send_message(s, "%s got paddled so hard by %s they need a few seconds to recover..." % (messagesplit[1].strip("@"), displayname)) else: send_message(s, "%s gets a paddling from %s! andyt90bat" % (messagesplit[1].strip("@"), displayname)) except KeyError: pass except Exception as errormsg: errorlog(errormsg, "!paddle", message)