From 75bd63d0bceded707df9e808280734e14368b732 Mon Sep 17 00:00:00 2001 From: Shivaram Lingamneni Date: Tue, 4 Jul 2023 21:44:18 -0400 Subject: [PATCH] add channel autojoin feature See discussion on #2077 --- default.yaml | 8 +++++++- irc/config.go | 1 + irc/server.go | 14 ++++++++++++++ traditional.yaml | 8 +++++++- 4 files changed, 29 insertions(+), 2 deletions(-) diff --git a/default.yaml b/default.yaml index 93cef8df..44b170e4 100644 --- a/default.yaml +++ b/default.yaml @@ -364,7 +364,7 @@ server: # in a "closed-loop" system where you control the server and all the clients, # you may want to increase the maximum (non-tag) length of an IRC line from # the default value of 512. DO NOT change this on a public server: - # max-line-len: 512 + #max-line-len: 512 # send all 0's as the LUSERS (user counts) output to non-operators; potentially useful # if you don't want to publicize how popular the server is @@ -615,6 +615,12 @@ channels: # (0 or omit for no expiration): invite-expiration: 24h + # channels that new clients will automatically join. this should be used with + # caution, since traditional IRC users will likely view it as an antifeature. + # it may be useful in small community networks that have a single "primary" channel: + #auto-join: + # - "#lounge" + # operator classes: # an operator has a single "class" (defining a privilege level), which can include # multiple "capabilities" (defining privileged actions they can take). all diff --git a/irc/config.go b/irc/config.go index 5ae49660..c723075c 100644 --- a/irc/config.go +++ b/irc/config.go @@ -644,6 +644,7 @@ type Config struct { } ListDelay time.Duration `yaml:"list-delay"` InviteExpiration custime.Duration `yaml:"invite-expiration"` + AutoJoin []string `yaml:"auto-join"` } OperClasses map[string]*OperClassConfig `yaml:"oper-classes"` diff --git a/irc/server.go b/irc/server.go index 6978c87e..fbf95beb 100644 --- a/irc/server.go +++ b/irc/server.go @@ -394,6 +394,12 @@ func (server *Server) tryRegister(c *Client, session *Session) (exiting bool) { } server.playRegistrationBurst(session) + + if len(config.Channels.AutoJoin) > 0 { + // only applicable to new clients, not reattaches: + server.handleAutojoins(session, config.Channels.AutoJoin) + } + return false } @@ -502,6 +508,14 @@ func (server *Server) MOTD(client *Client, rb *ResponseBuffer) { rb.Add(nil, server.name, RPL_ENDOFMOTD, client.nick, client.t("End of MOTD command")) } +func (server *Server) handleAutojoins(session *Session, channelNames []string) { + rb := NewResponseBuffer(session) + for _, chname := range channelNames { + server.channels.Join(session.client, chname, "", false, rb) + } + rb.Send(true) +} + func (client *Client) whoisChannelsNames(target *Client, multiPrefix bool, hasPrivs bool) []string { var chstrs []string targetInvis := target.HasMode(modes.Invisible) diff --git a/traditional.yaml b/traditional.yaml index 1291771c..811a1e7d 100644 --- a/traditional.yaml +++ b/traditional.yaml @@ -337,7 +337,7 @@ server: # in a "closed-loop" system where you control the server and all the clients, # you may want to increase the maximum (non-tag) length of an IRC line from # the default value of 512. DO NOT change this on a public server: - # max-line-len: 512 + #max-line-len: 512 # send all 0's as the LUSERS (user counts) output to non-operators; potentially useful # if you don't want to publicize how popular the server is @@ -587,6 +587,12 @@ channels: # (0 or omit for no expiration): invite-expiration: 24h + # channels that new clients will automatically join. this should be used with + # caution, since traditional IRC users will likely view it as an antifeature. + # it may be useful in small community networks that have a single "primary" channel: + #auto-join: + # - "#lounge" + # operator classes: # an operator has a single "class" (defining a privilege level), which can include # multiple "capabilities" (defining privileged actions they can take). all