From 7db983d592e2b0d04f4a22823f9a22f5099a900a Mon Sep 17 00:00:00 2001 From: Trevor Slocum Date: Fri, 15 Dec 2017 21:26:22 -0800 Subject: [PATCH] Improve HELP --- server.go | 106 ++++++++++++++++++++++++++++-------------------------- 1 file changed, 55 insertions(+), 51 deletions(-) diff --git a/server.go b/server.go index a848cf0..0938423 100644 --- a/server.go +++ b/server.go @@ -40,6 +40,7 @@ const ( COMMAND_REVEAL = "REVEAL" COMMAND_KICK = "KICK" COMMAND_BAN = "BAN" + COMMAND_AUDIT = "AUDIT" // Server admins only COMMAND_KILL = "KILL" @@ -68,22 +69,26 @@ var permissionLabels = map[int]string{ PERMISSION_SUPERADMIN: "Super Administrator", } +var ALL_PERMISSIONS = "Client, Registered Client, VIP, Moderator, Adminsitrator and Super Administrator" + var commandRestrictions = map[int][]string{ PERMISSION_REGISTERED: {COMMAND_TOKEN, COMMAND_USERNAME, COMMAND_PASSWORD, COMMAND_FOUND}, PERMISSION_MODERATOR: {COMMAND_REVEAL, COMMAND_KICK, COMMAND_BAN}, - PERMISSION_ADMIN: {COMMAND_GRANT}, + PERMISSION_ADMIN: {COMMAND_GRANT, COMMAND_AUDIT}, PERMISSION_SUPERADMIN: {COMMAND_DROP, COMMAND_KILL, COMMAND_STATS, COMMAND_REHASH, COMMAND_UPGRADE}} var helpDuration = "Duration can be 0 to never expire, or e.g. 30m, 1h, 2d, 3w" var commandUsage = map[string][]string{ - COMMAND_HELP: {"[command]", - "Print info regarding all commands or a specific command"}, + COMMAND_HELP: {"[command|all]", + "Print usage information regarding a specific command or 'all'", + "Without a command or 'all', only commands currently available are printed"}, COMMAND_INFO: {"[channel]", "When a channel is specified, prints info including whether it is registered", "Without a channel, server info is printed"}, COMMAND_REGISTER: {" ", - "Create an account, allowing you to found channels and moderate existing channels", - "See IDENTIFY, FOUND, GRANT"}, + "Create an account", + "Once you've registered, other users may GRANT permissions to you, or ", + "See IDENTIFY"}, COMMAND_IDENTIFY: {"[username] ", "Identify to a previously registered account", "If username is omitted, it will be replaced with your current nick", @@ -95,23 +100,29 @@ var commandUsage = map[string][]string{ COMMAND_PASSWORD: {" ", "Change your password"}, COMMAND_FOUND: {"", - "Register a channel"}, - COMMAND_GRANT: {" [account] [updated access]", - "When an account token isn't specified, all permissions are listed", - "View or update a user's access level by specifying their account token", - "To remove an account, set their access level to User"}, - COMMAND_REVEAL: {" [page] [full]", + "Take ownership of an unfounded channel"}, + COMMAND_GRANT: {" [account] [permission]", + "When an account token isn't specified, all accounts with permissions are listed", + "Specify an account token and permission level to grant that permission", + "Specify an account token only to view that account's permission", + "To remove an account's permissions, set their permission to Client", + "Permissions: " + ALL_PERMISSIONS}, + COMMAND_REVEAL: {" [page] [all]", "Print channel log, allowing KICK/BAN to be used", fmt.Sprintf("Results start at page 1, %d per page", CHANNEL_LOGS_PER_PAGE), - "All log entries are returned when viewing page -1", - "By default joins and parts are hidden, use 'full' to show them"}, + "Page -1 shows all matching entries", + "Joins and parts are hidden by default, add 'all' to show them"}, + COMMAND_AUDIT: {" [page]", + "Print channel audit log", + fmt.Sprintf("Results start at page 1, %d per page", CHANNEL_LOGS_PER_PAGE), + "Page -1 shows all matching entries"}, COMMAND_KICK: {" <5 digit log number> [reason]", "Kick a user from a channel"}, COMMAND_BAN: {" <5 digit log number> [reason]", "Kick and ban a user from a channel", helpDuration}, COMMAND_DROP: {" ", - "Delete all channel data, allowing it to be FOUNDed again"}, + "Delete all channel data, allowing it to be founded again"}, COMMAND_KILL: {" <5 digit log number> [reason]", "Disconnect and ban a user from the server", helpDuration}, @@ -564,13 +575,13 @@ func (s *Server) handleTopic(channel string, client string, topic string) { } func (s *Server) handleMode(c *Client, params []string) { - // TODO: irssi sends mode b, send response if len(params) == 0 || len(params[0]) == 0 { c.sendNotice("Invalid use of MODE") return } - if c == nil { + if len(params) > 1 && params[1] == "b" { + c.writeMessage(irc.RPL_ENDOFBANLIST, []string{params[0], "End of Channel Ban List"}) return } @@ -586,9 +597,8 @@ func (s *Server) handleMode(c *Client, params []string) { // Send channel creation time c.writeMessage(strings.Join([]string{"329", c.nick, params[0], fmt.Sprintf("%d", int32(ch.created))}, " "), []string{}) - } else if len(params) > 1 && len(params[1]) > 0 && (params[1][0] == '+' || params[1][0] == '-') { + } else if len(params) > 1 && len(params[1]) > 0 && params[1][0] == '+' || params[1][0] == '-' { if !c.canUse(irc.MODE, params[0]) { - // TODO: Send proper mode denied message c.accessDenied(c.permissionRequired(irc.MODE)) return } @@ -683,25 +693,17 @@ func (s *Server) handleMode(c *Client, params []string) { } } -func (s *Server) buildUsage(cl *Client, command string) map[string][]string { - u := map[string][]string{} +func (s *Server) sendUsage(cl *Client, command string) { command = strings.ToUpper(command) - for cmd, usage := range commandUsage { - if command == COMMAND_HELP || cmd == command { - if cl.canUse(cmd, "") { - u[cmd] = usage - } - } + + showAll := false + if command == "ALL" { + command = COMMAND_HELP + showAll = true } - return u -} - -func (s *Server) sendUsage(cl *Client, command string) { - u := s.buildUsage(cl, command) - - commands := make([]string, 0, len(u)) - for cmd := range u { + commands := make([]string, 0, len(commandUsage)) + for cmd := range commandUsage { commands = append(commands, cmd) } sort.Strings(commands) @@ -725,9 +727,11 @@ func (s *Server) sendUsage(cl *Client, command string) { for _, permission := range perms { printedLabel = false for _, cmd := range commands { - if cl.permissionRequired(cmd) != permission { + if (i == 0 && containsString(serverCommands, cmd)) || (i == 1 && !containsString(serverCommands, cmd)) || cl.permissionRequired(cmd) != permission { continue - } else if (i == 0 && containsString(serverCommands, cmd)) || (i == 1 && !containsString(serverCommands, cmd)) { + } + + if !showAll && !cl.canUse(cmd, "") { continue } @@ -736,7 +740,7 @@ func (s *Server) sendUsage(cl *Client, command string) { printedLabel = true } - usage = u[cmd] + usage = commandUsage[cmd] cl.sendMessage(cmd + " " + usage[0]) for _, ul := range usage[1:] { cl.sendMessage(" " + ul) @@ -745,14 +749,13 @@ func (s *Server) sendUsage(cl *Client, command string) { } } } else { - // TODO: Cleanup/merge - for _, cmd := range commands { - usage = u[cmd] - - cl.sendMessage(cmd + " " + usage[0]) + if usage, ok := commandUsage[command]; ok { + cl.sendMessage(command + " " + usage[0]) for _, ul := range usage[1:] { cl.sendMessage(" " + ul) } + } else { + cl.sendError("Unknown command specified") } } @@ -848,6 +851,7 @@ func (s *Server) handleUserCommand(client string, command string, params []strin } // TODO: Only alphanumeric username + // TODO: allow duplicate usernames, only return error on existing username and password case COMMAND_IDENTIFY: if len(params) == 0 || len(params) > 2 { s.sendUsage(cl, command) @@ -940,7 +944,7 @@ func (s *Server) handleUserCommand(client string, command string, params []strin log.Panicf("%+v", err) } cl.sendMessage("Password changed successfully") - case COMMAND_REVEAL: + case COMMAND_REVEAL, COMMAND_AUDIT: // TODO: &#chan shows moderator audit log, & alone shows server admin audit log if len(params) == 0 { s.sendUsage(cl, command) @@ -975,7 +979,11 @@ func (s *Server) handleUserCommand(client string, command string, params []strin } } - s.revealChannelLog(params[0], cl.identifier, page, all) + if command == COMMAND_REVEAL { + s.revealChannelLog(params[0], cl.identifier, page, all) + } else { + // TODO: Audit + } case COMMAND_KICK: if len(params) < 2 { s.sendUsage(cl, command) @@ -1119,7 +1127,7 @@ func (s *Server) handleRead(c *Client) { s.killClient(c, "") return } - if debugMode && (verbose || (len(msg.Command) >= 4 && msg.Command[0:4] != irc.PING && msg.Command[0:4] != irc.PONG)) { + if debugMode && (verbose || len(msg.Command) < 4 || (msg.Command[0:4] != irc.PING && msg.Command[0:4] != irc.PONG)) { log.Printf("%s -> %s", c.identifier, msg) } @@ -1263,11 +1271,7 @@ func (s *Server) handleRead(c *Client) { } } } else if msg.Command == irc.MODE { - if len(msg.Params) == 2 && validChannelPrefix(msg.Params[0]) && msg.Params[1] == "b" { - c.writeMessage(irc.RPL_ENDOFBANLIST, []string{msg.Params[0], "End of Channel Ban List"}) - } else { - s.handleMode(c, msg.Params) - } + s.handleMode(c, msg.Params) } else if msg.Command == irc.TOPIC && len(msg.Params) > 0 && len(msg.Params[0]) > 0 { if len(msg.Params) == 1 { s.sendTopic(msg.Params[0], c.identifier, false) @@ -1308,7 +1312,7 @@ func (s *Server) handleWrite(c *Client) { msg.Params = append([]string{c.nick}, msg.Params...) } - if debugMode && (verbose || (len(msg.Command) >= 4 && msg.Command[0:4] != irc.PING && msg.Command[0:4] != irc.PONG)) { + if debugMode && (verbose || len(msg.Command) < 4 || (msg.Command[0:4] != irc.PING && msg.Command[0:4] != irc.PONG)) { log.Printf("%s <- %s", c.identifier, msg) } c.writer.Encode(msg)