diff options
Diffstat (limited to 'geldschieberbot.py')
| -rw-r--r-- | geldschieberbot.py | 119 |
1 files changed, 59 insertions, 60 deletions
diff --git a/geldschieberbot.py b/geldschieberbot.py index 33fee20..27f87ae 100644 --- a/geldschieberbot.py +++ b/geldschieberbot.py @@ -7,18 +7,18 @@ import subprocess import sys import tanken -"""Path where our data is stored persistent on disk""" +# Path where our data is stored persistent on disk state_file = os.environ["GSB_STATE_FILE"] if os.path.isfile(state_file): state = json.load(open(state_file, "r")) else: - """Dict containing the whole state of geldschieberbot - balance - dict of dicts associating two persons to an amount - name2num, num2name - dicts associating numbers to names and vice versa - cars - dict associating car names to their service charge - scheduled_cmds - dict associating names to cmds, their schedule, and the last execution - changes - dict associating users with their changes""" + # Dict containing the whole state of geldschieberbot + # balance - dict of dicts associating two persons to an amount + # name2num, num2name - dicts associating numbers to names and vice versa + # cars - dict associating car names to their service charge + # scheduled_cmds - dict associating names to cmds, their schedule, and the last execution + # changes - dict associating users with their changes state = { "balance": {}, "name2num": {}, @@ -44,7 +44,7 @@ else: for num in state["changes"]: name = state["num2name"][num] state["changes"][name] = state["changes"][num] - del (state["changes"][num]) + del state["changes"][num] balance = state["balance"] name2num = state["name2num"] @@ -103,7 +103,7 @@ def to_euro(cents): def send(msg): if not quiet: - subprocess.run(send_cmd.split(' '), input=msg.encode()) + subprocess.run(send_cmd.split(' '), input=msg.encode(), check=True) def create_summary(user): @@ -218,7 +218,7 @@ def register(sender, args, msg): try: to_cent(name) return None, "pure numerical names are not allowed" - except: + except (ValueError, TypeError): pass if name in name2num: @@ -241,25 +241,25 @@ cmds["reg"] = register cmds["register"] = register -def summary(sender, args, msg): +def summary(sender, args, msg): # pylint: disable=unused-argument if len(args) == 1: return create_total_summary(), None - elif len(args) > 1: - err = None - msg = "Summary:\n" - for name in args[1:]: - if name in name2num or name in available_cars: - msg += create_summary(name) + "\n" - else: - err = f'name "{name}" not registered' - return msg, err + + err = None + msg = "Summary:\n" + for name in args[1:]: + if name in name2num or name in available_cars: + msg += create_summary(name) + "\n" + else: + err = f'name "{name}" not registered' + return msg, err cmds["sum"] = summary cmds["summary"] = summary -def list_users(sender, args, msg): +def list_users(sender, args, msg): # pylint: disable=unused-argument return create_members(), None @@ -267,7 +267,7 @@ cmds["ls"] = list_users cmds["list"] = list_users -def usage(sender, args, msg): +def usage(sender, args, msg): # pylint: disable=unused-argument return create_help(), None @@ -285,13 +285,13 @@ def split(sender, args, msg): try: amount = to_cent(args[1]) persons = args[2:] - except: + except (ValueError, TypeError): # support !split name amount if len(args) == 3: try: amount = to_cent(args[2]) persons = [args[1]] - except: + except (ValueError, TypeError): return None, "amount must be a positive number" else: return None, "amount must be a positive number" @@ -350,7 +350,7 @@ def transaction(sender, args, msg): try: amount = to_cent(amount) - except: + except (ValueError, TypeError): return None, "amount must be a positive number" if args[0] in ["!zieh", "!nimm"]: @@ -381,20 +381,20 @@ def transfer(sender, args, msg): if not sender in num2name: return None, 'you must register first' - else: - sender = num2name[sender] + + sender = num2name[sender] try: amount_raw = args[1] amount_cent = to_cent(amount_raw) - except: + except (ValueError, TypeError): return None, "amount must be a positive number" source, destination = args[2:4] if source not in balance: return None, f'source "{source}" not known' - elif destination not in balance: + if destination not in balance: return None, f'destination "{destination}" not known' output = "" @@ -407,8 +407,8 @@ def transfer(sender, args, msg): if err: # No changes yet we can fail return None, err - else: - output += ret + + output += ret # Sender <- X Source change.append((sender, source, -amount_cent)) @@ -416,8 +416,8 @@ def transfer(sender, args, msg): if err: output += err + "\nThe balance may be in a inconsistent state please take care manually" return output, None - else: - output += ret + + output += ret # Sender -> X Destination change.append((sender, destination, amount_cent)) @@ -425,8 +425,8 @@ def transfer(sender, args, msg): if err: output += err + "\nThe balance may be in a inconsistent state please take care manually" return output, None - else: - output += ret + + output += ret # Destination -> X Source change.append((destination, source, amount_cent)) @@ -461,35 +461,37 @@ def cars(sender, args, msg): return None, f'"{car}" is no available car\n' return ret_msg[:-1], None + # add car - elif args[1] in ["add", "new"]: + if args[1] in ["add", "new"]: if len(args) < 4: return None, f'not in form "{args[0]} {args[1]} car-name service-charge"' car = args[2] if car in available_cars: - return None, '"{}" already registered'.format(car) + return None, f'"{car}" already registered' if car in balance: return None, f'A user named "{car}" already exists. Please use a different name for this car' try: service_charge = to_cent(args[3]) - except: + except (ValueError, TypeError): return None, "service-charge must be a positive number" available_cars[car] = service_charge add_to_balance(car) return f'added "{car}" as an available car', None + # pay bill - elif args[1] in ["pay"]: + if args[1] in ["pay"]: if len(args) < 4: return None, f'not in form "{args[0]} {args[1]} car-name amount"' if not sender in num2name: return None, "you must register first" - else: - sender_name = num2name[sender] + + sender_name = num2name[sender] car = args[2] if car not in available_cars: @@ -498,7 +500,7 @@ def cars(sender, args, msg): try: amount = to_cent(args[3]) amount_euro = to_euro(amount) - except: + except (ValueError, TypeError): return None, "amount must be a positive number" output = "" @@ -521,7 +523,7 @@ def cars(sender, args, msg): proportion = -1 * (amount / total_available_charge) _, err = transaction(sender, f"!gib {car} {amount_euro}".split(), "") - assert (err is None) + assert err is None output += f"{sender_name} payed {amount_euro}\n" # transfer money @@ -534,7 +536,7 @@ def cars(sender, args, msg): to_move_euro = to_euro(to_move) ret, err = transfer(sender, ["transfer", to_move_euro, car, person], "") - assert (err is None) + assert err is None output += "Transfer {} from {} to {}\n".format( to_move_euro, person, sender_name) @@ -548,8 +550,8 @@ def cars(sender, args, msg): changes[sender_name].append(change) return output, None - else: - return None, 'unknown car subcommand "{}".'.format(args[1]) + + return None, f'unknown car subcommand "{args[1]}".' cmds["cars"] = cars @@ -557,11 +559,10 @@ cmds["cars"] = cars def _tanken(sender, args, msg): if len(args) < 2: - return None, 'not in form "{} amount [person] [car] [info]"'.format( - args[0]) + return None, f'not in form "{args[0]} amount [person] [car] [info]"' try: amount = to_cent(args[1]) - except: + except (ValueError, TypeError): return None, "amount must be a number" # find recipient @@ -585,7 +586,7 @@ def _tanken(sender, args, msg): parts, err = tanken.tanken(msg[1:], amount, service_charge) - if err != None: + if err: return None, err output = "" @@ -601,8 +602,7 @@ def _tanken(sender, args, msg): person_to_charge = pname if pname not in name2num: person_to_charge = recipient - output += " {} held accountable for service charge.".format( - recipient) + output += f" {recipient} held accountable for service charge." record(car, person_to_charge, values["service_charge"]) change.append([car, person_to_charge, values["service_charge"]]) @@ -634,8 +634,8 @@ cmds["tanken"] = _tanken def fuck(sender, args, msg): if not sender in num2name: return None, "you must register first" - else: - name = num2name[sender] + + name = num2name[sender] nchanges = len(changes[name]) if nchanges == 0: @@ -746,14 +746,13 @@ def schedule(sender, args, msg): sender_name = num2name[sender] if len(args) < 3: - return None, 'not in form "{} name cmd"'.format(args[0]) + return None, f'not in form "{args[0]} name cmd"' name = args[1] cmd = args[2:] if name in scheduled_cmds: - return None, 'there is already a scheduled command named "{}"'.format( - name) + return None, f'there is already a scheduled command named "{name}"' # Test the command global dry_run @@ -802,14 +801,14 @@ cmds["yearly"] = schedule def cancel(sender, args, msg): cmd_name = args[1] if not cmd_name in scheduled_cmds: - return None, '"{}" is not a scheduled command'.format(cmd_name) + return None, f'"{cmd_name}" is not a scheduled command' cmd = scheduled_cmds[cmd_name] if not cmd["sender"] == sender: return None, 'only the original creator can cancel this command' - del (scheduled_cmds[cmd_name]) - return 'Cancelled the {} cmd "{}"'.format(cmd["schedule"], cmd_name), None + del scheduled_cmds[cmd_name] + return f'Cancelled the {cmd["schedule"]} cmd "{cmd_name}"', None cmds["cancel"] = cancel |
