registrar

Files related to my duties as Registrar of Agora Nomic
git clone git://juanmeleiro.mat.br/registrar
Log | Files | Refs | README

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 }