From 2948bb0f646e4e416a9494883772bd3f86507cc6 Mon Sep 17 00:00:00 2001 From: HimbeerserverDE Date: Thu, 14 Jan 2021 21:37:03 +0100 Subject: [PATCH] Lua -> Go: Priv command family --- multiserver/igutils.go | 120 ++++++++++++++++++++++++++- multiserver/plugins/builtin/init.lua | 68 --------------- privs.go | 48 +++++------ 3 files changed, 143 insertions(+), 93 deletions(-) diff --git a/multiserver/igutils.go b/multiserver/igutils.go index e460390..7b5bf85 100644 --- a/multiserver/igutils.go +++ b/multiserver/igutils.go @@ -68,6 +68,12 @@ func init() { privs["end"] = make(map[string]bool) privs["end"]["end"] = true + privs["grant"] = make(map[string]bool) + privs["grant"]["privs"] = true + + privs["revoke"] = make(map[string]bool) + privs["revoke"]["privs"] = true + multiserver.RegisterChatCommand("send", privs["send"], cmdSend) multiserver.RegisterChatCommand("sendcurrent", privs["sendcurrent"], @@ -167,7 +173,7 @@ func init() { allow, err := p.CheckPrivs(reqprivs) if err != nil { log.Print(err) - p.SendChatMsg("An internal error occured while trying to check your privileges.") + p.SendChatMsg("An internal error occured while attempting to check your privileges.") return } @@ -216,4 +222,116 @@ func init() { func(p *multiserver.Peer, param string) { go multiserver.End(false, false) }) + + multiserver.RegisterChatCommand("privs", nil, + func(p *multiserver.Peer, param string) { + var r string + + name := param + var p2 *multiserver.Peer + if name == "" { + p2 = p + r += "Your privileges: " + } else { + p2 = multiserver.GetListener().GetPeerByName(name) + r += name + "'s privileges: " + } + + if name != "" && !multiserver.IsOnline(name) { + p.SendChatMsg(name + " is not online.") + return + } + + privs, err := p2.GetPrivs() + if err != nil { + log.Print(err) + p.SendChatMsg("An internal error occured while attempting to get the privileges.") + return + } + + var privnames []string + for k, v := range privs { + if v { + privnames = append(privnames, k) + } + } + + p.SendChatMsg(r + strings.Join(privnames, " ")) + }) + + multiserver.RegisterChatCommand("grant", privs["grant"], + func(p *multiserver.Peer, param string) { + name := strings.Split(param, " ")[0] + var privnames string + var p2 *multiserver.Peer + if len(strings.Split(param, " ")) < 2 { + p2 = p + privnames = name + } else { + p2 = multiserver.GetListener().GetPeerByName(name) + privnames = strings.Split(param, " ")[1] + } + + if len(strings.Split(param, " ")) >= 2 && !multiserver.IsOnline(name) { + p.SendChatMsg(name + " is not online.") + return + } + + privs, err := p2.GetPrivs() + if err != nil { + log.Print(err) + p.SendChatMsg("An internal error occured while attempting to get the privileges.") + return + } + splitprivs := strings.Split(strings.Replace(privnames, " ", "", -1), ",") + for i := range splitprivs { + privs[splitprivs[i]] = true + } + err = p2.SetPrivs(privs) + if err != nil { + log.Print(err) + p.SendChatMsg("An internal error occured while attempting to get the privileges.") + return + } + + p.SendChatMsg("Privileges updated.") + }) + + multiserver.RegisterChatCommand("revoke", privs["revoke"], + func(p *multiserver.Peer, param string) { + name := strings.Split(param, " ")[0] + var privnames string + var p2 *multiserver.Peer + if len(strings.Split(param, " ")) < 2 { + p2 = p + privnames = name + } else { + p2 = multiserver.GetListener().GetPeerByName(name) + privnames = strings.Split(param, " ")[1] + } + + if len(strings.Split(param, " ")) >= 2 && !multiserver.IsOnline(name) { + p.SendChatMsg(name + " is not online.") + return + } + + privs, err := p2.GetPrivs() + if err != nil { + log.Print(err) + p.SendChatMsg("An internal error occured while attempting to get the privileges.") + return + } + splitprivs := strings.Split(strings.Replace(privnames, " ", "", -1), ",") + for i := range splitprivs { + privs[splitprivs[i]] = false + } + err = p2.SetPrivs(privs) + if err != nil { + log.Print(err) + p.SendChatMsg("An internal error occured while attempting to set the privileges.") + return + } + + p.SendChatMsg("Privileges updated.") + }) } diff --git a/multiserver/plugins/builtin/init.lua b/multiserver/plugins/builtin/init.lua index 5a732e3..0d43174 100644 --- a/multiserver/plugins/builtin/init.lua +++ b/multiserver/plugins/builtin/init.lua @@ -1,71 +1,3 @@ -multiserver.register_chatcommand("p_privs", { - privs = {}, - func = function(id, param) - local name = param - if not name or name == "" then - name = multiserver.get_player_name(id) - end - - local privs = multiserver.get_player_privs(name) - local privnames = {} - for priv, v in pairs(privs) do - table.insert(privnames, priv) - end - - return name .. "'s privileges: " .. table.concat(privnames, " ") - end, -}) - -multiserver.register_chatcommand("p_grant", { - privs = {privs = true}, - func = function(id, param) - local name = multiserver.split(param, " ")[1] - local privnames = multiserver.split(param, " ")[2] - - if not privnames or privnames == "" then - privnames = name - name = multiserver.get_player_name(id) - end - - if not multiserver.get_peer_id(name) then - return name .. " is not online." - end - - local privs = multiserver.get_player_privs(name) - for _, newpriv in ipairs(multiserver.split(privnames:gsub(" ", ""), ",")) do - privs[newpriv] = true - end - multiserver.set_player_privs(name, privs) - - return "Privileges updated." - end, -}) - -multiserver.register_chatcommand("p_revoke", { - privs = {privs = true}, - func = function(id, param) - local name = multiserver.split(param, " ")[1] - local privnames = multiserver.split(param, " ")[2] - - if not privnames or privnames == "" then - privnames = name - name = multiserver.get_player_name(id) - end - - if not multiserver.get_peer_id(name) then - return name .. " is not online." - end - - local privs = multiserver.get_player_privs(name) - for _, rmpriv in ipairs(multiserver.split(privnames:gsub(" ", ""), ",")) do - privs[rmpriv] = nil - end - multiserver.set_player_privs(name, privs) - - return "Privileges updated." - end, -}) - multiserver.register_on_redirect_done(function(id, newsrv, success) if not success then multiserver.chat_send_player(id, "Could not connect you to " .. newsrv .. "!") diff --git a/privs.go b/privs.go index e19a7ca..548610e 100644 --- a/privs.go +++ b/privs.go @@ -115,30 +115,6 @@ func readPrivItem(db *sql.DB, name string) (string, error) { return r, nil } -func init() { - admin := GetConfKey("admin") - if admin != nil || fmt.Sprintf("%T", admin) == "string" { - db, err := initAuthDB() - if err != nil { - log.Print(err) - return - } - - eprivs, err := readPrivItem(db, admin.(string)) - if err != nil { - log.Print(err) - return - } - - privs := decodePrivs(eprivs) - privs["privs"] = true - - newprivs := encodePrivs(privs) - - modPrivItem(db, admin.(string), newprivs) - } -} - func (p *Peer) GetPrivs() (map[string]bool, error) { db, err := initAuthDB() if err != nil { @@ -185,3 +161,27 @@ func (p *Peer) CheckPrivs(req map[string]bool) (bool, error) { return allow, nil } + +func init() { + admin := GetConfKey("admin") + if admin != nil || fmt.Sprintf("%T", admin) == "string" { + db, err := initAuthDB() + if err != nil { + log.Print(err) + return + } + + eprivs, err := readPrivItem(db, admin.(string)) + if err != nil { + log.Print(err) + return + } + + privs := decodePrivs(eprivs) + privs["privs"] = true + + newprivs := encodePrivs(privs) + + modPrivItem(db, admin.(string), newprivs) + } +}