mirror of
https://github.com/ergochat/ergo.git
synced 2024-11-25 13:29:27 +01:00
Misc refactoring
This commit is contained in:
parent
d854bac78e
commit
2ecec25d28
@ -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
|
||||
)
|
@ -63,3 +63,15 @@ const (
|
||||
// Cap302 refers to the IRCv3.2 CAP spec.
|
||||
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
|
||||
)
|
||||
|
@ -67,16 +67,19 @@ type RegisteredChannel struct {
|
||||
Invitelist []string
|
||||
}
|
||||
|
||||
// ChannelRegistry manages registered channels.
|
||||
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
|
||||
// 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.
|
||||
sync.Mutex // tier 2
|
||||
server *Server
|
||||
}
|
||||
|
||||
// NewChannelRegistry returns a new ChannelRegistry.
|
||||
func NewChannelRegistry(server *Server) *ChannelRegistry {
|
||||
return &ChannelRegistry{
|
||||
server: server,
|
||||
|
@ -12,16 +12,18 @@ import (
|
||||
"github.com/oragono/oragono/irc/sno"
|
||||
)
|
||||
|
||||
func (server *Server) chanservReceiveNotice(client *Client, message string) {
|
||||
// do nothing
|
||||
}
|
||||
|
||||
// ChanServNotice sends the client a notice from ChanServ.
|
||||
func (client *Client) ChanServNotice(text string) {
|
||||
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
|
||||
for _, p := range strings.Split(message, " ") {
|
||||
if len(p) > 0 {
|
||||
|
@ -44,7 +44,7 @@ type Client struct {
|
||||
authorized bool
|
||||
awayMessage string
|
||||
capabilities *caps.Set
|
||||
capState CapState
|
||||
capState caps.State
|
||||
capVersion caps.Version
|
||||
certfp string
|
||||
channels ChannelSet
|
||||
@ -92,7 +92,7 @@ func NewClient(server *Server, conn net.Conn, isTLS bool) *Client {
|
||||
atime: now,
|
||||
authorized: server.Password() == nil,
|
||||
capabilities: caps.NewSet(),
|
||||
capState: CapNone,
|
||||
capState: caps.NoneState,
|
||||
capVersion: caps.Cap301,
|
||||
channels: make(ChannelSet),
|
||||
ctime: now,
|
||||
|
@ -533,7 +533,7 @@ func capHandler(server *Server, client *Client, msg ircmsg.IrcMessage) bool {
|
||||
switch subCommand {
|
||||
case "LS":
|
||||
if !client.registered {
|
||||
client.capState = CapNegotiating
|
||||
client.capState = caps.NegotiatingState
|
||||
}
|
||||
if len(msg.Params) > 1 && msg.Params[1] == "302" {
|
||||
client.capVersion = 302
|
||||
@ -549,7 +549,7 @@ func capHandler(server *Server, client *Client, msg ircmsg.IrcMessage) bool {
|
||||
|
||||
case "REQ":
|
||||
if !client.registered {
|
||||
client.capState = CapNegotiating
|
||||
client.capState = caps.NegotiatingState
|
||||
}
|
||||
|
||||
// make sure all capabilities actually exist
|
||||
@ -564,7 +564,7 @@ func capHandler(server *Server, client *Client, msg ircmsg.IrcMessage) bool {
|
||||
|
||||
case "END":
|
||||
if !client.registered {
|
||||
client.capState = CapNegotiated
|
||||
client.capState = caps.NegotiatedState
|
||||
server.tryRegister(client)
|
||||
}
|
||||
|
||||
@ -576,7 +576,7 @@ func capHandler(server *Server, client *Client, msg ircmsg.IrcMessage) bool {
|
||||
|
||||
// csHandler handles the /CS and /CHANSERV commands
|
||||
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
|
||||
}
|
||||
|
||||
@ -1676,7 +1676,7 @@ func nickHandler(server *Server, client *Client, msg ircmsg.IrcMessage) bool {
|
||||
|
||||
// NOTICE <target>{,<target>} <message>
|
||||
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], ",")
|
||||
message := msg.Params[1]
|
||||
|
||||
@ -1710,10 +1710,10 @@ func noticeHandler(server *Server, client *Client, msg ircmsg.IrcMessage) bool {
|
||||
continue
|
||||
}
|
||||
if target == "chanserv" {
|
||||
server.chanservReceiveNotice(client, message)
|
||||
server.chanservNoticeHandler(client, message)
|
||||
continue
|
||||
} else if target == "nickserv" {
|
||||
server.nickservReceiveNotice(client, message)
|
||||
server.nickservNoticeHandler(client, message)
|
||||
continue
|
||||
}
|
||||
|
||||
@ -1778,7 +1778,7 @@ func npcaHandler(server *Server, client *Client, msg ircmsg.IrcMessage) bool {
|
||||
|
||||
// nsHandler handles the /NS and /NICKSERV commands
|
||||
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
|
||||
}
|
||||
|
||||
@ -1901,7 +1901,7 @@ func pongHandler(server *Server, client *Client, msg ircmsg.IrcMessage) bool {
|
||||
|
||||
// PRIVMSG <target>{,<target>} <message>
|
||||
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], ",")
|
||||
message := msg.Params[1]
|
||||
|
||||
@ -1937,10 +1937,10 @@ func privmsgHandler(server *Server, client *Client, msg ircmsg.IrcMessage) bool
|
||||
} else {
|
||||
target, err = CasefoldName(targetString)
|
||||
if target == "chanserv" {
|
||||
server.chanservReceivePrivmsg(client, message)
|
||||
server.chanservPrivmsgHandler(client, message)
|
||||
continue
|
||||
} else if target == "nickserv" {
|
||||
server.nickservReceivePrivmsg(client, message)
|
||||
server.nickservPrivmsgHandler(client, message)
|
||||
continue
|
||||
}
|
||||
user := server.clients.Get(target)
|
||||
@ -2159,7 +2159,7 @@ func sceneHandler(server *Server, client *Client, msg ircmsg.IrcMessage) bool {
|
||||
|
||||
// TAGMSG <target>{,<target>}
|
||||
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
|
||||
if clientOnlyTags == nil {
|
||||
return false
|
||||
|
@ -27,10 +27,6 @@ To login to an account:
|
||||
Leave out [username password] to use your client certificate fingerprint. Otherwise,
|
||||
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.
|
||||
func extractParam(line string) (string, string) {
|
||||
rawParams := strings.SplitN(strings.TrimSpace(line), " ", 2)
|
||||
@ -42,7 +38,13 @@ func extractParam(line string) (string, string) {
|
||||
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 = strings.ToLower(command)
|
||||
|
||||
|
@ -49,6 +49,14 @@ var (
|
||||
supportedUserModesString = modes.SupportedUserModes.String()
|
||||
// supportedChannelModesString acts as a cache for when we introduce users
|
||||
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.
|
||||
@ -422,7 +430,7 @@ func (server *Server) generateMessageID() string {
|
||||
|
||||
func (server *Server) tryRegister(c *Client) {
|
||||
if c.registered || !c.HasNick() || !c.HasUsername() ||
|
||||
(c.capState == CapNegotiating) {
|
||||
(c.capState == caps.NegotiatingState) {
|
||||
return
|
||||
}
|
||||
|
||||
|
@ -1,7 +1,7 @@
|
||||
// Copyright (c) 2016-2017 Daniel Oaks <daniel@danieloaks.net>
|
||||
// released under the MIT license
|
||||
|
||||
package irc
|
||||
package utils
|
||||
|
||||
import "github.com/goshuirc/irc-go/ircmsg"
|
||||
|
Loading…
Reference in New Issue
Block a user