diff options
author | NEMESIS13cz <seke94@seznam.cz> | 2015-08-11 02:45:03 +0200 |
---|---|---|
committer | NEMESIS13cz <seke94@seznam.cz> | 2015-08-11 02:45:03 +0200 |
commit | d683203aca48bf50149c7048311ca86b2c6d5960 (patch) | |
tree | d17335bb58ffbbc149816d4b3df5cf7708851686 /calc.py | |
parent | 77f445002c9963adb77c553deb011ef2567d3bb2 (diff) |
Rewrote a lot, added a lot
Diffstat (limited to 'calc.py')
-rw-r--r-- | calc.py | 82 |
1 files changed, 72 insertions, 10 deletions
@@ -1,28 +1,90 @@ from helpers import * import threading +import time -calc_users = open_json_file("calc", []) +calc_users = open_json_file("calc", []) +math_operators = ["+", "-", "*", "/", "%", ">", "<", "^", "&", "|"] +allowed_strings = ["0b", "0x", "(", ")", "hex(", "bin(", "abs(", "int(", "min(", "max(", "round(", "float("] calc_perm = "utils.calc" +calc_perm_power = "utils.calc.power" -def calculate(text): - pass +def calc(sender, text): + """ + extracts a mathematical expression from `text` + returns (expression, result) or None + """ + expression = "" + should_calc = False + i = 0 + while True: + if i >= len(text): + break + char = text[i] + if i < len(text) - 5 and str(char + text[i+1] + text[i+2] + text[i+3] + text[i+4] + text[i+5]) in allowed_strings: + expression += char + expression += text[i + 1] + expression += text[i + 2] + expression += text[i + 3] + expression += text[i + 4] + expression += text[i + 5] + i += 5 + should_calc = True + elif i < len(text) - 3 and str(char + text[i+1] + text[i+2] + text[i+3]) in allowed_strings: + expression += char + expression += text[i + 1] + expression += text[i + 2] + expression += text[i + 3] + i += 3 + should_calc = True + elif i < len(text) - 1 and str(char + text[i + 1]) in allowed_strings: + expression += char + expression += text[i + 1] + i += 1 + should_calc = True + elif char.isdigit() or (expression and char == ".") or (should_calc and char == " ") or (should_calc and char == ","): + expression += char + should_calc = True + elif char in math_operators or char in ["(", ")"]: + # calculation must include at least 1 operator + should_calc = True + expression += char + elif should_calc and char.isalpha(): + # don't include any more text in the calculation + break + i += 1 + last_char = ' ' + for char in expression: + if last_char == '*' and char == '*': + if sender.hasPermission(calc_perm_power): + break + else: + return None + last_char = char + if should_calc: + try: + result = str(eval(expression)) # pylint: disable = W0123 + except: # pylint: disable = W0702 + # we can run into all kinds of errors here + # most probably SyntaxError + return None + return (expression, result) + return None -def calc(text, sender): - try: - result = calculate(text) - msg(sender, "&2=== Calc:&6 %s" % result) - except: - msg(sender, "&2=== Calc:&c Something went wrong while calculating - calulation aborted") +def thread_calc(message, sender): + output = calc(sender, message) + if output and sender.isOnline(): + msg(sender, "&2=== Calc: &e" + output[0] + " &2= &c" + output[1]) @hook.event("player.AsyncPlayerChatEvent", "monitor") def on_calc_chat(event): sender = event.getPlayer() message = event.getMessage() if not event.isCancelled() and uid(sender) in calc_users and sender.hasPermission(calc_perm): - thread = threading.Thread(target=calc, args=(message, sender)) + thread = threading.Thread(target=thread_calc, args=(message, sender)) thread.daemon = True thread.start() + @hook.command("calc", description="Toggles chat calculations") def on_calc_command(sender, command, label, args): plugin_header(sender, "Chat Calculator") |