3
0
mirror of https://github.com/ergochat/ergo.git synced 2024-11-10 22:19:31 +01:00

help: Generate index of help topics

This commit is contained in:
Daniel Oaks 2017-04-30 13:53:49 +10:00
parent 2c9b2db9e3
commit 51425b7764
4 changed files with 109 additions and 12 deletions

View File

@ -95,6 +95,10 @@ var Commands = map[string]Command{
handler: helpHandler, handler: helpHandler,
minParams: 0, minParams: 0,
}, },
"HELPOP": {
handler: helpHandler,
minParams: 0,
},
"INVITE": { "INVITE": {
handler: inviteHandler, handler: inviteHandler,
minParams: 2, minParams: 2,

View File

@ -4,15 +4,28 @@
package irc package irc
import ( import (
"fmt"
"sort"
"strings" "strings"
"github.com/DanielOaks/girc-go/ircmsg" "github.com/DanielOaks/girc-go/ircmsg"
) )
// HelpEntryType represents the different sorts of help entries that can exist.
type HelpEntryType int
const (
CommandHelpEntry HelpEntryType = 0
InformationHelpEntry HelpEntryType = 1
ISupportHelpEntry HelpEntryType = 2
)
// HelpEntry represents an entry in the Help map. // HelpEntry represents an entry in the Help map.
type HelpEntry struct { type HelpEntry struct {
oper bool oper bool
text string text string
helpType HelpEntryType
duplicate bool
} }
// used for duplicates // used for duplicates
@ -128,7 +141,12 @@ ON <server> specifies that the ban is to be set on that specific server.
"help": { "help": {
text: `HELP <argument> text: `HELP <argument>
Get an explanation of <argument>.`, Get an explanation of <argument>, or "index" for a list of help topics.`,
},
"helpop": {
text: `HELPOP <argument>
Get an explanation of <argument>, or "index" for a list of help topics.`,
}, },
"invite": { "invite": {
text: `INVITE <nickname> <channel> text: `INVITE <nickname> <channel>
@ -411,19 +429,26 @@ Returns historical information on the last user with the given nickname.`,
// Informational // Informational
"modes": { "modes": {
text: cmodeHelpText + "\n\n" + umodeHelpText, text: cmodeHelpText + "\n\n" + umodeHelpText,
helpType: InformationHelpEntry,
}, },
"cmode": { "cmode": {
text: cmodeHelpText, text: cmodeHelpText,
helpType: InformationHelpEntry,
}, },
"cmodes": { "cmodes": {
text: cmodeHelpText, text: cmodeHelpText,
helpType: InformationHelpEntry,
duplicate: true,
}, },
"umode": { "umode": {
text: umodeHelpText, text: umodeHelpText,
helpType: InformationHelpEntry,
}, },
"umodes": { "umodes": {
text: umodeHelpText, text: umodeHelpText,
helpType: InformationHelpEntry,
duplicate: true,
}, },
// RPL_ISUPPORT // RPL_ISUPPORT
@ -433,6 +458,7 @@ Returns historical information on the last user with the given nickname.`,
Oragono supports an experimental unicode casemapping designed for extended Oragono supports an experimental unicode casemapping designed for extended
Unicode support. This casemapping is based off RFC 7613 and the draft rfc7613 Unicode support. This casemapping is based off RFC 7613 and the draft rfc7613
casemapping spec here: http://oragono.io/specs.html`, casemapping spec here: http://oragono.io/specs.html`,
helpType: ISupportHelpEntry,
}, },
"prefix": { "prefix": {
text: `RPL_ISUPPORT PREFIX text: `RPL_ISUPPORT PREFIX
@ -444,9 +470,63 @@ Oragono supports the following channel membership prefixes:
+o (@) | Operator channel mode. +o (@) | Operator channel mode.
+h (%) | Halfop channel mode. +h (%) | Halfop channel mode.
+v (+) | Voice channel mode.`, +v (+) | Voice channel mode.`,
helpType: ISupportHelpEntry,
}, },
} }
// HelpIndex contains the list of all help topics for regular users.
var HelpIndex = "list of all help topics for regular users"
// HelpIndexOpers contains the list of all help topics for opers.
var HelpIndexOpers = "list of all help topics for opers"
// GenerateHelpIndex is used to generate HelpIndex.
func GenerateHelpIndex(forOpers bool) string {
newHelpIndex := `= Help Topics =
Commands:
%s
RPL_ISUPPORT Tokens:
%s
Information:
%s`
// generate them
var commands, isupport, information []string
var line string
for name, info := range Help {
if info.duplicate {
continue
}
if info.oper && !forOpers {
continue
}
line = fmt.Sprintf(" %s", name)
if info.helpType == CommandHelpEntry {
commands = append(commands, line)
} else if info.helpType == ISupportHelpEntry {
isupport = append(isupport, line)
} else if info.helpType == InformationHelpEntry {
information = append(information, line)
}
}
// sort the lines
sort.Strings(commands)
sort.Strings(isupport)
sort.Strings(information)
// sub them in
newHelpIndex = fmt.Sprintf(newHelpIndex, strings.Join(commands, "\n"), strings.Join(isupport, "\n"), strings.Join(information, "\n"))
return newHelpIndex
}
// sendHelp sends the client help of the given string. // sendHelp sends the client help of the given string.
func (client *Client) sendHelp(name string, text string) { func (client *Client) sendHelp(name string, text string) {
splitName := strings.Split(name, " ") splitName := strings.Split(name, " ")
@ -462,7 +542,7 @@ func (client *Client) sendHelp(name string, text string) {
} }
} }
args := splitName args := splitName
args = append(args, "End of /HELP") args = append(args, "End of /HELPOP")
client.Send(nil, client.server.name, RPL_ENDOFHELP, args...) client.Send(nil, client.server.name, RPL_ENDOFHELP, args...)
} }
@ -471,9 +551,19 @@ func helpHandler(server *Server, client *Client, msg ircmsg.IrcMessage) bool {
argument := strings.ToLower(strings.TrimSpace(strings.Join(msg.Params, " "))) argument := strings.ToLower(strings.TrimSpace(strings.Join(msg.Params, " ")))
if len(argument) < 1 { if len(argument) < 1 {
client.sendHelp("HELP", `HELP <argument> client.sendHelp("HELPOP", `HELPOP <argument>
Get an explanation of <argument>.`) Get an explanation of <argument>, or "index" for a list of help topics.`)
return false
}
// handle index
if argument == "index" {
if client.flags[Operator] {
client.sendHelp("HELP", HelpIndexOpers)
} else {
client.sendHelp("HELP", HelpIndex)
}
return false return false
} }

View File

@ -20,5 +20,5 @@ func (server *Server) nickservReceiveNotice(client *Client, message string) {
} }
func (server *Server) nickservReceivePrivmsg(client *Client, message string) { func (server *Server) nickservReceivePrivmsg(client *Client, message string) {
client.Notice("NickServ is not yet implemented, sorry! To register an account, check /HELP REG") client.Notice("NickServ is not yet implemented, sorry! To register an account, check /HELPOP REG")
} }

View File

@ -156,6 +156,9 @@ func NewServer(configFilename string, config *Config, logger *logger.Manager) (*
return nil, fmt.Errorf("Help entry does not exist for command %s", name) return nil, fmt.Errorf("Help entry does not exist for command %s", name)
} }
} }
// generate help indexes
HelpIndex = GenerateHelpIndex(false)
HelpIndexOpers = GenerateHelpIndex(true)
if config.Accounts.AuthenticationEnabled { if config.Accounts.AuthenticationEnabled {
SupportedCapabilities[SASL] = true SupportedCapabilities[SASL] = true