import subprocess from bot import * def isfloat(value): try: float(value) return True except ValueError: return False async def rpninp(self, chan, nick, msg): if chan not in self.rpnhist: self.rpnhist[chan] = [0] try: msg = msg.replace("+", " + ") msg = msg.replace("a", " a ") # msg = msg.replace('-',' - ') msg = msg.replace("s", " s ") msg = msg.replace("\\", " \\ ") msg = msg.replace("*", " * ") msg = msg.replace("x", " x ") msg = msg.replace("m", " m ") msg = msg.replace("/", " / ") msg = msg.replace("d", " d ") msg = msg.replace("^", " ^ ") msg = msg.replace("e", " e ") for m in msg.split(): self.rpnhist[chan].append(0) del self.rpnhist[chan][15:] if isfloat(m): self.rpnhist[chan].insert(0, float(m)) continue elif m == "+" or m == "a": self.rpnhist[chan][0] = self.rpnhist[chan][0] + self.rpnhist[chan].pop( 1 ) elif m == "-" or m == "s": self.rpnhist[chan][0] = ( self.rpnhist[chan].pop(1) - self.rpnhist[chan][0] ) elif m == "\\": self.rpnhist[chan].insert(0, self.rpnhist[chan][0]) elif m == "*" or m == "x" or m == "m": self.rpnhist[chan][0] = ( self.rpnhist[chan].pop(1) * self.rpnhist[chan][0] ) elif m == "/" or m == "d": try: self.rpnhist[chan][0] = ( self.rpnhist[chan].pop(1) / self.rpnhist[chan][0] ) except ZeroDivisionError: self.rpnhist[chan][0] = float("NaN") elif m == "^" or m == "e": self.rpnhist[chan][0] = ( self.rpnhist[chan].pop(1) ** self.rpnhist[chan][0] ) elif msg == "p": pass # just dont do anything lol elif msg == "r": if chan in self.rpnprint: await self.message( chan, str(self.rpnhist[chan]) ) return else: return except OverflowError: if chan in self.rpnprint: await self.message(chan, "no u ur numbers are too big chonk") return if chan in self.rpnprint: await self.message(chan, str(self.rpnhist[chan][0])) async def rpntinp(self, chan, nick, msg): if chan in self.rpnprint: await rpninp(self, chan, nick, msg) else: self.rpnprint.append(chan) await rpninp(self, chan, nick, msg) self.rpnprint.remove(chan) async def rpntoggle(self, chan, nick, msg): if chan in self.rpnprint: self.rpnprint.remove(chan) await self.message(chan, "rpn outputting has been disabled") else: self.rpnprint.append(chan) await self.message(chan, "rpn outputting has been enabled") async def init(self): # self.help['rpn'] = ['rpn - simple reverse polish notation calculator (more)', 'it has an alias of . so you can just do {}. , and if enabled it will also parse floats and functions as input. there are 4 functions, add (+|a), subtract (-|s), multiply (*|x|m), and devide (/|d), and p to print register 0'.format(self.prefix)] shared.commands["rpn"] = rpntinp shared.commands["."] = rpntinp shared.rawm["rpn"] = rpninp shared.commands["rt"] = rpntoggle # self.help['rt'] = ['rt - toggle the output of rpn calculatons into the channel', 'rpn is cool'] self.rpnhist = {} self.rpnprint = []