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

Misc refactoring

This commit is contained in:
Daniel Oaks 2018-02-03 21:15:07 +10:00
parent d854bac78e
commit 2ecec25d28
9 changed files with 55 additions and 59 deletions

View File

@ -1,31 +0,0 @@
// Copyright (c) 2012-2014 Jeremy Latt
// Copyright (c) 2016-2017 Daniel Oaks <daniel@danieloaks.net>
// released under the MIT license
package irc
import (
"github.com/oragono/oragono/irc/caps"
)
var (
// SupportedCapabilities are the caps we advertise.
// MaxLine, SASL and STS are set during server startup.
SupportedCapabilities = caps.NewSet(caps.AccountTag, caps.AccountNotify, caps.AwayNotify, caps.CapNotify, caps.ChgHost, caps.EchoMessage, caps.ExtendedJoin, caps.InviteNotify, caps.Languages, caps.MessageTags, caps.MultiPrefix, caps.Rename, caps.Resume, caps.ServerTime, caps.UserhostInNames)
// CapValues are the actual values we advertise to v3.2 clients.
// actual values are set during server startup.
CapValues = caps.NewValues()
)
// CapState shows whether we're negotiating caps, finished, etc for connection registration.
type CapState uint
const (
// CapNone means CAP hasn't been negotiated at all.
CapNone CapState = iota
// CapNegotiating means CAP is being negotiated and registration should be paused.
CapNegotiating CapState = iota
// CapNegotiated means CAP negotiation has been successfully ended and reg should complete.
CapNegotiated CapState = iota
)

View File

@ -63,3 +63,15 @@ const (
// Cap302 refers to the IRCv3.2 CAP spec. // Cap302 refers to the IRCv3.2 CAP spec.
Cap302 Version = 302 Cap302 Version = 302
) )
// State shows whether we're negotiating caps, finished, etc for connection registration.
type State uint
const (
// NoneState means CAP hasn't been negotiated at all.
NoneState State = iota
// NegotiatingState means CAP is being negotiated and registration should be paused.
NegotiatingState State = iota
// NegotiatedState means CAP negotiation has been successfully ended and reg should complete.
NegotiatedState State = iota
)

View File

@ -67,16 +67,19 @@ type RegisteredChannel struct {
Invitelist []string Invitelist []string
} }
// ChannelRegistry manages registered channels.
type ChannelRegistry struct { type ChannelRegistry struct {
// this serializes operations of the form (read channel state, synchronously persist it); // This serializes operations of the form (read channel state, synchronously persist it);
// this is enough to guarantee eventual consistency of the database with the // this is enough to guarantee eventual consistency of the database with the
// ChannelManager and Channel objects, which are the source of truth. // ChannelManager and Channel objects, which are the source of truth.
// Wwe could use the buntdb RW transaction lock for this purpose but we share //
// We could use the buntdb RW transaction lock for this purpose but we share
// that with all the other modules, so let's not. // that with all the other modules, so let's not.
sync.Mutex // tier 2 sync.Mutex // tier 2
server *Server server *Server
} }
// NewChannelRegistry returns a new ChannelRegistry.
func NewChannelRegistry(server *Server) *ChannelRegistry { func NewChannelRegistry(server *Server) *ChannelRegistry {
return &ChannelRegistry{ return &ChannelRegistry{
server: server, server: server,

View File

@ -12,16 +12,18 @@ import (
"github.com/oragono/oragono/irc/sno" "github.com/oragono/oragono/irc/sno"
) )
func (server *Server) chanservReceiveNotice(client *Client, message string) {
// do nothing
}
// ChanServNotice sends the client a notice from ChanServ. // ChanServNotice sends the client a notice from ChanServ.
func (client *Client) ChanServNotice(text string) { func (client *Client) ChanServNotice(text string) {
client.Send(nil, fmt.Sprintf("ChanServ!services@%s", client.server.name), "NOTICE", client.nick, text) client.Send(nil, fmt.Sprintf("ChanServ!services@%s", client.server.name), "NOTICE", client.nick, text)
} }
func (server *Server) chanservReceivePrivmsg(client *Client, message string) { // chanservReceiveNotice handles NOTICEs that ChanServ receives.
func (server *Server) chanservNoticeHandler(client *Client, message string) {
// do nothing
}
// chanservReceiveNotice handles NOTICEs that ChanServ receives.
func (server *Server) chanservPrivmsgHandler(client *Client, message string) {
var params []string var params []string
for _, p := range strings.Split(message, " ") { for _, p := range strings.Split(message, " ") {
if len(p) > 0 { if len(p) > 0 {

View File

@ -44,7 +44,7 @@ type Client struct {
authorized bool authorized bool
awayMessage string awayMessage string
capabilities *caps.Set capabilities *caps.Set
capState CapState capState caps.State
capVersion caps.Version capVersion caps.Version
certfp string certfp string
channels ChannelSet channels ChannelSet
@ -92,7 +92,7 @@ func NewClient(server *Server, conn net.Conn, isTLS bool) *Client {
atime: now, atime: now,
authorized: server.Password() == nil, authorized: server.Password() == nil,
capabilities: caps.NewSet(), capabilities: caps.NewSet(),
capState: CapNone, capState: caps.NoneState,
capVersion: caps.Cap301, capVersion: caps.Cap301,
channels: make(ChannelSet), channels: make(ChannelSet),
ctime: now, ctime: now,

View File

@ -533,7 +533,7 @@ func capHandler(server *Server, client *Client, msg ircmsg.IrcMessage) bool {
switch subCommand { switch subCommand {
case "LS": case "LS":
if !client.registered { if !client.registered {
client.capState = CapNegotiating client.capState = caps.NegotiatingState
} }
if len(msg.Params) > 1 && msg.Params[1] == "302" { if len(msg.Params) > 1 && msg.Params[1] == "302" {
client.capVersion = 302 client.capVersion = 302
@ -549,7 +549,7 @@ func capHandler(server *Server, client *Client, msg ircmsg.IrcMessage) bool {
case "REQ": case "REQ":
if !client.registered { if !client.registered {
client.capState = CapNegotiating client.capState = caps.NegotiatingState
} }
// make sure all capabilities actually exist // make sure all capabilities actually exist
@ -564,7 +564,7 @@ func capHandler(server *Server, client *Client, msg ircmsg.IrcMessage) bool {
case "END": case "END":
if !client.registered { if !client.registered {
client.capState = CapNegotiated client.capState = caps.NegotiatedState
server.tryRegister(client) server.tryRegister(client)
} }
@ -576,7 +576,7 @@ func capHandler(server *Server, client *Client, msg ircmsg.IrcMessage) bool {
// csHandler handles the /CS and /CHANSERV commands // csHandler handles the /CS and /CHANSERV commands
func csHandler(server *Server, client *Client, msg ircmsg.IrcMessage) bool { func csHandler(server *Server, client *Client, msg ircmsg.IrcMessage) bool {
server.chanservReceivePrivmsg(client, strings.Join(msg.Params, " ")) server.chanservPrivmsgHandler(client, strings.Join(msg.Params, " "))
return false return false
} }
@ -1676,7 +1676,7 @@ func nickHandler(server *Server, client *Client, msg ircmsg.IrcMessage) bool {
// NOTICE <target>{,<target>} <message> // NOTICE <target>{,<target>} <message>
func noticeHandler(server *Server, client *Client, msg ircmsg.IrcMessage) bool { func noticeHandler(server *Server, client *Client, msg ircmsg.IrcMessage) bool {
clientOnlyTags := GetClientOnlyTags(msg.Tags) clientOnlyTags := utils.GetClientOnlyTags(msg.Tags)
targets := strings.Split(msg.Params[0], ",") targets := strings.Split(msg.Params[0], ",")
message := msg.Params[1] message := msg.Params[1]
@ -1710,10 +1710,10 @@ func noticeHandler(server *Server, client *Client, msg ircmsg.IrcMessage) bool {
continue continue
} }
if target == "chanserv" { if target == "chanserv" {
server.chanservReceiveNotice(client, message) server.chanservNoticeHandler(client, message)
continue continue
} else if target == "nickserv" { } else if target == "nickserv" {
server.nickservReceiveNotice(client, message) server.nickservNoticeHandler(client, message)
continue continue
} }
@ -1778,7 +1778,7 @@ func npcaHandler(server *Server, client *Client, msg ircmsg.IrcMessage) bool {
// nsHandler handles the /NS and /NICKSERV commands // nsHandler handles the /NS and /NICKSERV commands
func nsHandler(server *Server, client *Client, msg ircmsg.IrcMessage) bool { func nsHandler(server *Server, client *Client, msg ircmsg.IrcMessage) bool {
server.nickservReceivePrivmsg(client, strings.Join(msg.Params, " ")) server.nickservPrivmsgHandler(client, strings.Join(msg.Params, " "))
return false return false
} }
@ -1901,7 +1901,7 @@ func pongHandler(server *Server, client *Client, msg ircmsg.IrcMessage) bool {
// PRIVMSG <target>{,<target>} <message> // PRIVMSG <target>{,<target>} <message>
func privmsgHandler(server *Server, client *Client, msg ircmsg.IrcMessage) bool { func privmsgHandler(server *Server, client *Client, msg ircmsg.IrcMessage) bool {
clientOnlyTags := GetClientOnlyTags(msg.Tags) clientOnlyTags := utils.GetClientOnlyTags(msg.Tags)
targets := strings.Split(msg.Params[0], ",") targets := strings.Split(msg.Params[0], ",")
message := msg.Params[1] message := msg.Params[1]
@ -1937,10 +1937,10 @@ func privmsgHandler(server *Server, client *Client, msg ircmsg.IrcMessage) bool
} else { } else {
target, err = CasefoldName(targetString) target, err = CasefoldName(targetString)
if target == "chanserv" { if target == "chanserv" {
server.chanservReceivePrivmsg(client, message) server.chanservPrivmsgHandler(client, message)
continue continue
} else if target == "nickserv" { } else if target == "nickserv" {
server.nickservReceivePrivmsg(client, message) server.nickservPrivmsgHandler(client, message)
continue continue
} }
user := server.clients.Get(target) user := server.clients.Get(target)
@ -2159,7 +2159,7 @@ func sceneHandler(server *Server, client *Client, msg ircmsg.IrcMessage) bool {
// TAGMSG <target>{,<target>} // TAGMSG <target>{,<target>}
func tagmsgHandler(server *Server, client *Client, msg ircmsg.IrcMessage) bool { func tagmsgHandler(server *Server, client *Client, msg ircmsg.IrcMessage) bool {
clientOnlyTags := GetClientOnlyTags(msg.Tags) clientOnlyTags := utils.GetClientOnlyTags(msg.Tags)
// no client-only tags, so we can drop it // no client-only tags, so we can drop it
if clientOnlyTags == nil { if clientOnlyTags == nil {
return false return false

View File

@ -27,10 +27,6 @@ To login to an account:
Leave out [username password] to use your client certificate fingerprint. Otherwise, Leave out [username password] to use your client certificate fingerprint. Otherwise,
the given username and password will be used.` the given username and password will be used.`
func (server *Server) nickservReceiveNotice(client *Client, message string) {
// do nothing
}
// extractParam extracts a parameter from the given string, returning the param and the rest of the string. // extractParam extracts a parameter from the given string, returning the param and the rest of the string.
func extractParam(line string) (string, string) { func extractParam(line string) (string, string) {
rawParams := strings.SplitN(strings.TrimSpace(line), " ", 2) rawParams := strings.SplitN(strings.TrimSpace(line), " ", 2)
@ -42,7 +38,13 @@ func extractParam(line string) (string, string) {
return param0, param1 return param0, param1
} }
func (server *Server) nickservReceivePrivmsg(client *Client, message string) { // nickservNoticeHandler handles NOTICEs that NickServ receives.
func (server *Server) nickservNoticeHandler(client *Client, message string) {
// do nothing
}
// nickservPrivmsgHandler handles PRIVMSGs that NickServ receives.
func (server *Server) nickservPrivmsgHandler(client *Client, message string) {
command, params := extractParam(message) command, params := extractParam(message)
command = strings.ToLower(command) command = strings.ToLower(command)

View File

@ -49,6 +49,14 @@ var (
supportedUserModesString = modes.SupportedUserModes.String() supportedUserModesString = modes.SupportedUserModes.String()
// supportedChannelModesString acts as a cache for when we introduce users // supportedChannelModesString acts as a cache for when we introduce users
supportedChannelModesString = modes.SupportedChannelModes.String() supportedChannelModesString = modes.SupportedChannelModes.String()
// SupportedCapabilities are the caps we advertise.
// MaxLine, SASL and STS are set during server startup.
SupportedCapabilities = caps.NewSet(caps.AccountTag, caps.AccountNotify, caps.AwayNotify, caps.CapNotify, caps.ChgHost, caps.EchoMessage, caps.ExtendedJoin, caps.InviteNotify, caps.Languages, caps.MessageTags, caps.MultiPrefix, caps.Rename, caps.Resume, caps.ServerTime, caps.UserhostInNames)
// CapValues are the actual values we advertise to v3.2 clients.
// actual values are set during server startup.
CapValues = caps.NewValues()
) )
// Limits holds the maximum limits for various things such as topic lengths. // Limits holds the maximum limits for various things such as topic lengths.
@ -422,7 +430,7 @@ func (server *Server) generateMessageID() string {
func (server *Server) tryRegister(c *Client) { func (server *Server) tryRegister(c *Client) {
if c.registered || !c.HasNick() || !c.HasUsername() || if c.registered || !c.HasNick() || !c.HasUsername() ||
(c.capState == CapNegotiating) { (c.capState == caps.NegotiatingState) {
return return
} }

View File

@ -1,7 +1,7 @@
// Copyright (c) 2016-2017 Daniel Oaks <daniel@danieloaks.net> // Copyright (c) 2016-2017 Daniel Oaks <daniel@danieloaks.net>
// released under the MIT license // released under the MIT license
package irc package utils
import "github.com/goshuirc/irc-go/ircmsg" import "github.com/goshuirc/irc-go/ircmsg"