3
0
mirror of https://github.com/ergochat/ergo.git synced 2024-11-25 13:29:27 +01:00

clean up force-trailing logic

This commit is contained in:
Shivaram Lingamneni 2023-06-01 06:28:02 -04:00
parent 38a6d17ee5
commit 60af8ee491
3 changed files with 25 additions and 19 deletions

View File

@ -1425,27 +1425,27 @@ func composeMultilineBatch(batchID, fromNickMask, fromAccount string, isBot bool
} }
var ( var (
// these are all the output commands that MUST have their last param be a trailing. // in practice, many clients require that the final parameter be a trailing
// this is needed because dumb clients like to treat trailing params separately from the // (prefixed with `:`) even when this is not syntactically necessary.
// other params in messages. // by default, force the following commands to use a trailing:
commandsThatMustUseTrailing = map[string]bool{ commandsThatMustUseTrailing = utils.SetLiteral(
"PRIVMSG": true, "PRIVMSG",
"NOTICE": true, "NOTICE",
RPL_WHOISCHANNELS,
RPL_WHOISCHANNELS: true, RPL_USERHOST,
RPL_USERHOST: true,
// mirc's handling of RPL_NAMREPLY is broken: // mirc's handling of RPL_NAMREPLY is broken:
// https://forums.mirc.com/ubbthreads.php/topics/266939/re-nick-list // https://forums.mirc.com/ubbthreads.php/topics/266939/re-nick-list
RPL_NAMREPLY: true, RPL_NAMREPLY,
} )
) )
func forceTrailing(config *Config, command string) bool {
return config.Server.Compatibility.forceTrailing && commandsThatMustUseTrailing.Has(command)
}
// SendRawMessage sends a raw message to the client. // SendRawMessage sends a raw message to the client.
func (session *Session) SendRawMessage(message ircmsg.Message, blocking bool) error { func (session *Session) SendRawMessage(message ircmsg.Message, blocking bool) error {
// use dumb hack to force the last param to be a trailing param if required if forceTrailing(session.client.server.Config(), message.Command) {
config := session.client.server.Config()
if config.Server.Compatibility.forceTrailing && commandsThatMustUseTrailing[message.Command] {
message.ForceTrailing() message.ForceTrailing()
} }

View File

@ -79,8 +79,7 @@ func (m *MessageCache) Initialize(server *Server, serverTime time.Time, msgid st
m.params = params m.params = params
var msg ircmsg.Message var msg ircmsg.Message
config := server.Config() if forceTrailing(server.Config(), command) {
if config.Server.Compatibility.forceTrailing && commandsThatMustUseTrailing[command] {
msg.ForceTrailing() msg.ForceTrailing()
} }
msg.Source = nickmask msg.Source = nickmask
@ -111,8 +110,7 @@ func (m *MessageCache) InitializeSplitMessage(server *Server, nickmask, accountN
m.target = target m.target = target
m.splitMessage = message m.splitMessage = message
config := server.Config() forceTrailing := forceTrailing(server.Config(), command)
forceTrailing := config.Server.Compatibility.forceTrailing && commandsThatMustUseTrailing[command]
if message.Is512() { if message.Is512() {
isTagmsg := command == "TAGMSG" isTagmsg := command == "TAGMSG"

View File

@ -20,6 +20,14 @@ func (s HashSet[T]) Remove(elem T) {
delete(s, elem) delete(s, elem)
} }
func SetLiteral[T comparable](elems ...T) HashSet[T] {
result := make(HashSet[T], len(elems))
for _, elem := range elems {
result.Add(elem)
}
return result
}
func CopyMap[K comparable, V any](input map[K]V) (result map[K]V) { func CopyMap[K comparable, V any](input map[K]V) (result map[K]V) {
result = make(map[K]V, len(input)) result = make(map[K]V, len(input))
for key, value := range input { for key, value := range input {