registrar (6632B)
1 #!/usr/bin/lua5.4 2 -- -*- mode: lua; -*- 3 4 local argparse = require "argparse" 5 local json = require "json" 6 local path = require "path" 7 8 require "lib.utils" 9 local registration = require "lib.registration" 10 local report = require "lib.report" 11 local birthday = require "lib.birthday" 12 local activity = require "lib.activity" 13 local writ = require "lib.writ" 14 local check = require "lib.check" 15 16 local parser = argparse("registrar", "Manage Agora's registrar duties") 17 parser:flag("-p", "Pretend: only show what would be done") 18 19 parser:command_target("command") 20 21 local cmd = {} 22 23 cmd.monthly = parser: command ("monthly", "Generate and send registrar monthly report") 24 cmd.weekly = parser: command ("weekly", "Generate and send registrar weekly report") 25 26 cmd.birthday = parser: command ("birthday", "Announce a player's birthday") 27 cmd.birthday: argument ("name", "The name of the player") 28 29 cmd.deregister = parser: command ("deregister", "Deregister player") 30 cmd.deregister: argument ("name", "The name of the player") 31 cmd.deregister: argument ("date", "Time stamp of deregistration (seconds after epoch)") :convert(tonumber) 32 cmd.deregister: argument ("reason", "Reason for deregistering") 33 :choices(registration.reasons) 34 cmd.deregister: option ("-m", "Message ID of deregistration (without 'message://' prefix)") 35 36 cmd.register = parser: command ("register", "Register player") 37 cmd.register: argument ("name", "The name of the player") 38 cmd.register: argument ("contact", "URL (or plain email address) to contact player") 39 cmd.register: argument ("date", "Time stamp of registration (seconds after epoch)") :convert(tonumber) 40 cmd.register: option ("-m", "Message ID of registration (without 'message://' prefix)") 41 42 cmd.birthday = parser: command ("birthday", "Announce player's birthday") 43 cmd.birthday: argument ("name", "The name of the player") 44 45 cmd.activate = parser: command ("activate", "Activate player") 46 cmd.activate: argument ("name", "The name of the player") 47 cmd.activate: argument ("when", "When they were activated (seconds after epoch)") :convert(tonumber) 48 cmd.activate: option ("-m", "Message ID of activation (without 'message://' prefix)") 49 50 cmd.deactivate = parser: command ("deactivate", "Deactivate player") 51 cmd.deactivate: argument ("name", "The name of the player") 52 cmd.deactivate: argument ("when", "When they were deactivated (seconds after epoch)") :convert(tonumber) 53 cmd.deactivate: option ("-m", "Message ID of deactivation (without 'message://' prefix)") 54 55 cmd.rename = parser: command ("rename", "Rename player") 56 cmd.rename: argument ("who", "Current player name") 57 cmd.rename: argument ("whither", "New player name") 58 cmd.rename: option ("-m", "Message ID of renaming (without 'message://' prefix)") 59 60 cmd.readdress = parser: command ("readdress", "Change player's address") 61 cmd.readdress: argument ("who", "Player to be readdressed") 62 cmd.readdress: argument ("whither", "New address") 63 cmd.readdress: argument ("when", "When the message was received") :convert(tonumber) 64 cmd.readdress: option ("-m", "Message ID of readdressing (without 'message://' prefix)") 65 66 cmd.writ = parser: command("writ", "Send a Writ of FAGE") 67 cmd.writ: argument("who", "Player that submited the Cantus Cygneus") 68 cmd.writ: argument("when", "Date of the message") :convert(tonumber) 69 cmd.writ: argument("cantus", "Path to file containing the Cantus Cygneus") 70 cmd.writ: option("-m", "Message ID of the cantus") 71 72 cmd.check = parser: command("check", "Check the integrity of this repository and display any errors.\nReturn status is 0 if everything is ok.") 73 74 -- Deserialize 75 local fns = { 76 players = "players.json", 77 log = "log.json" 78 } 79 80 local args = parser:parse() 81 local players = decodewith(json.decode, fns.players) 82 local log = decodewith(json.decode, fns.log) 83 84 -- Process 85 86 if args.command == "monthly" then 87 report.monthly(args, players, log) 88 elseif args.command == "weekly" then 89 report.weekly(args, players, log) 90 elseif args.command == "register" then 91 registration.register(args, players, log) 92 elseif args.command == "deregister" then 93 registration.deregister(args, players, log) 94 elseif args.command == "birthday" then 95 birthday(args, players, log) 96 elseif args.command == "activate" then 97 activity.activate(args, players, log) 98 elseif args.command == "deactivate" then 99 activity.deactivate(args, players, log) 100 elseif args.command == "rename" then 101 registration.rename(args, players, log) 102 elseif args.command == "readdress" then 103 registration.readdress(args, players, log) 104 elseif args.command == "writ" then 105 writ(args, players, log) 106 elseif args.command == "check" then 107 check(args, player, log) 108 else 109 io.write("Unknown command.\n") 110 end 111 112 -- Serialize 113 encodewith(json.encode, fns.players, players) 114 encodewith(json.encode, fns.log, log) 115 jsonformat(fns.players) 116 jsonformat(fns.log) 117 118 -- Do git stuff 119 120 local gitactions = { 121 monthly = { 122 files = {"archive/", "log.json"}, 123 message = function (args) return "Publish monthly report" end 124 }, 125 weekly = { 126 files = {"archive/", "log.json"}, 127 message = function (args) return "Publish weekly report" end 128 }, 129 register = { 130 files = {"players.json", "log.json"}, 131 message = function (args) return string.format("Register %s", args.who) end 132 }, 133 deregister = { 134 files = {"players.json", "log.json"}, 135 message = function (args) return string.format("Deregister %s", args.who) end 136 }, 137 birthday = { 138 files = {"archive/", "log.json"}, 139 message = function (args) return string.format("Announce %s's birthday", args.who) end 140 }, 141 activate = { 142 files = {"players.json", "log.json"}, 143 message = function (args) return string.format("Make %s active", args.who) end 144 }, 145 deactivate = { 146 files = {"players.json", "log.json"}, 147 message = function (args) return string.format("Make %s inactive", args.who) end 148 }, 149 rename = { 150 files = {"players.json", "log.json"}, 151 message = function (args) return string.format("Rename %s to %s", args.who, args.whither) end 152 }, 153 readdress = { 154 files = {"players.json", "log.json"}, 155 message = function (args) return string.format("Change %s's address", args.who) end 156 } 157 }