2017-10-02 10:42:50 +02:00
|
|
|
// Copyright (c) 2017 Shivaram Lingamneni <slingamn@cs.stanford.edu>
|
|
|
|
// released under the MIT license
|
|
|
|
|
|
|
|
package irc
|
|
|
|
|
2018-02-03 11:21:32 +01:00
|
|
|
import (
|
|
|
|
"github.com/oragono/oragono/irc/isupport"
|
|
|
|
"github.com/oragono/oragono/irc/modes"
|
2018-03-18 02:32:12 +01:00
|
|
|
"sync/atomic"
|
2018-02-03 11:21:32 +01:00
|
|
|
)
|
2017-10-05 15:39:57 +02:00
|
|
|
|
2018-03-18 02:32:12 +01:00
|
|
|
func (server *Server) MaxSendQBytes() int {
|
2018-03-19 05:24:20 +01:00
|
|
|
return int(atomic.LoadUint32(&server.maxSendQBytes))
|
2018-03-18 02:32:12 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
func (server *Server) SetMaxSendQBytes(m int) {
|
2018-03-19 05:24:20 +01:00
|
|
|
atomic.StoreUint32(&server.maxSendQBytes, uint32(m))
|
2018-03-18 02:32:12 +01:00
|
|
|
}
|
|
|
|
|
2017-11-03 07:36:55 +01:00
|
|
|
func (server *Server) ISupport() *isupport.List {
|
2017-10-02 10:42:50 +02:00
|
|
|
server.configurableStateMutex.RLock()
|
|
|
|
defer server.configurableStateMutex.RUnlock()
|
|
|
|
return server.isupport
|
|
|
|
}
|
|
|
|
|
2017-11-03 07:36:55 +01:00
|
|
|
func (server *Server) Limits() Limits {
|
2017-10-02 10:42:50 +02:00
|
|
|
server.configurableStateMutex.RLock()
|
|
|
|
defer server.configurableStateMutex.RUnlock()
|
|
|
|
return server.limits
|
|
|
|
}
|
|
|
|
|
2017-11-03 07:36:55 +01:00
|
|
|
func (server *Server) Password() []byte {
|
2017-10-02 10:42:50 +02:00
|
|
|
server.configurableStateMutex.RLock()
|
|
|
|
defer server.configurableStateMutex.RUnlock()
|
|
|
|
return server.password
|
|
|
|
}
|
2017-10-04 06:57:03 +02:00
|
|
|
|
2017-10-26 10:19:01 +02:00
|
|
|
func (server *Server) RecoverFromErrors() bool {
|
|
|
|
server.configurableStateMutex.RLock()
|
|
|
|
defer server.configurableStateMutex.RUnlock()
|
|
|
|
return server.recoverFromErrors
|
|
|
|
}
|
2017-10-04 06:57:03 +02:00
|
|
|
|
2017-10-16 00:01:59 +02:00
|
|
|
func (server *Server) ProxyAllowedFrom() []string {
|
|
|
|
server.configurableStateMutex.RLock()
|
|
|
|
defer server.configurableStateMutex.RUnlock()
|
|
|
|
return server.proxyAllowedFrom
|
|
|
|
}
|
|
|
|
|
|
|
|
func (server *Server) WebIRCConfig() []webircConfig {
|
|
|
|
server.configurableStateMutex.RLock()
|
|
|
|
defer server.configurableStateMutex.RUnlock()
|
|
|
|
return server.webirc
|
|
|
|
}
|
|
|
|
|
2018-02-03 11:21:32 +01:00
|
|
|
func (server *Server) DefaultChannelModes() modes.Modes {
|
2017-10-30 10:21:47 +01:00
|
|
|
server.configurableStateMutex.RLock()
|
|
|
|
defer server.configurableStateMutex.RUnlock()
|
|
|
|
return server.defaultChannelModes
|
|
|
|
}
|
|
|
|
|
2017-11-09 04:19:50 +01:00
|
|
|
func (server *Server) ChannelRegistrationEnabled() bool {
|
|
|
|
server.configurableStateMutex.RLock()
|
|
|
|
defer server.configurableStateMutex.RUnlock()
|
|
|
|
return server.channelRegistrationEnabled
|
|
|
|
}
|
|
|
|
|
2018-02-11 11:30:40 +01:00
|
|
|
func (server *Server) AccountConfig() *AccountConfig {
|
|
|
|
server.configurableStateMutex.RLock()
|
|
|
|
defer server.configurableStateMutex.RUnlock()
|
2018-03-22 16:04:21 +01:00
|
|
|
if server.config == nil {
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
return &server.config.Accounts
|
|
|
|
}
|
|
|
|
|
|
|
|
func (server *Server) FakelagConfig() *FakelagConfig {
|
|
|
|
server.configurableStateMutex.RLock()
|
|
|
|
defer server.configurableStateMutex.RUnlock()
|
|
|
|
if server.config == nil {
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
return &server.config.Fakelag
|
2018-02-11 11:30:40 +01:00
|
|
|
}
|
|
|
|
|
2018-04-19 08:48:19 +02:00
|
|
|
func (server *Server) GetOperator(name string) (oper *Oper) {
|
|
|
|
name, err := CasefoldName(name)
|
|
|
|
if err != nil {
|
|
|
|
return
|
|
|
|
}
|
|
|
|
server.configurableStateMutex.RLock()
|
|
|
|
defer server.configurableStateMutex.RUnlock()
|
|
|
|
return server.operators[name]
|
|
|
|
}
|
|
|
|
|
2017-11-03 07:36:55 +01:00
|
|
|
func (client *Client) Nick() string {
|
2017-10-04 06:57:03 +02:00
|
|
|
client.stateMutex.RLock()
|
|
|
|
defer client.stateMutex.RUnlock()
|
|
|
|
return client.nick
|
|
|
|
}
|
|
|
|
|
2017-11-03 07:36:55 +01:00
|
|
|
func (client *Client) NickMaskString() string {
|
2017-10-04 06:57:03 +02:00
|
|
|
client.stateMutex.RLock()
|
|
|
|
defer client.stateMutex.RUnlock()
|
|
|
|
return client.nickMaskString
|
|
|
|
}
|
|
|
|
|
2017-11-03 07:36:55 +01:00
|
|
|
func (client *Client) NickCasefolded() string {
|
2017-10-04 06:57:03 +02:00
|
|
|
client.stateMutex.RLock()
|
|
|
|
defer client.stateMutex.RUnlock()
|
|
|
|
return client.nickCasefolded
|
|
|
|
}
|
2017-10-15 18:24:28 +02:00
|
|
|
|
2017-10-23 01:50:16 +02:00
|
|
|
func (client *Client) Username() string {
|
|
|
|
client.stateMutex.RLock()
|
|
|
|
defer client.stateMutex.RUnlock()
|
|
|
|
return client.username
|
|
|
|
}
|
|
|
|
|
|
|
|
func (client *Client) Hostname() string {
|
|
|
|
client.stateMutex.RLock()
|
|
|
|
defer client.stateMutex.RUnlock()
|
|
|
|
return client.hostname
|
|
|
|
}
|
|
|
|
|
|
|
|
func (client *Client) Realname() string {
|
|
|
|
client.stateMutex.RLock()
|
|
|
|
defer client.stateMutex.RUnlock()
|
|
|
|
return client.realname
|
|
|
|
}
|
|
|
|
|
2018-04-19 08:48:19 +02:00
|
|
|
func (client *Client) Oper() *Oper {
|
|
|
|
client.stateMutex.RLock()
|
|
|
|
defer client.stateMutex.RUnlock()
|
|
|
|
return client.oper
|
|
|
|
}
|
|
|
|
|
|
|
|
func (client *Client) SetOper(oper *Oper) {
|
|
|
|
client.stateMutex.Lock()
|
|
|
|
defer client.stateMutex.Unlock()
|
|
|
|
client.oper = oper
|
|
|
|
}
|
|
|
|
|
2017-10-15 18:24:28 +02:00
|
|
|
func (client *Client) Registered() bool {
|
|
|
|
client.stateMutex.RLock()
|
|
|
|
defer client.stateMutex.RUnlock()
|
|
|
|
return client.registered
|
|
|
|
}
|
|
|
|
|
|
|
|
func (client *Client) Destroyed() bool {
|
|
|
|
client.stateMutex.RLock()
|
|
|
|
defer client.stateMutex.RUnlock()
|
|
|
|
return client.isDestroyed
|
|
|
|
}
|
2017-10-23 01:50:16 +02:00
|
|
|
|
2018-02-11 11:30:40 +01:00
|
|
|
func (client *Client) Account() string {
|
|
|
|
client.stateMutex.RLock()
|
|
|
|
defer client.stateMutex.RUnlock()
|
|
|
|
return client.account
|
|
|
|
}
|
|
|
|
|
2017-11-09 04:19:50 +01:00
|
|
|
func (client *Client) AccountName() string {
|
|
|
|
client.stateMutex.RLock()
|
|
|
|
defer client.stateMutex.RUnlock()
|
2018-02-11 11:30:40 +01:00
|
|
|
if client.accountName == "" {
|
|
|
|
return "*"
|
|
|
|
}
|
|
|
|
return client.accountName
|
|
|
|
}
|
|
|
|
|
2018-02-20 10:50:46 +01:00
|
|
|
func (client *Client) SetAccountName(account string) (changed bool) {
|
2018-02-11 11:30:40 +01:00
|
|
|
var casefoldedAccount string
|
2018-02-20 10:50:46 +01:00
|
|
|
var err error
|
2018-02-11 11:30:40 +01:00
|
|
|
if account != "" {
|
2018-02-20 10:50:46 +01:00
|
|
|
if casefoldedAccount, err = CasefoldName(account); err != nil {
|
|
|
|
return
|
|
|
|
}
|
2018-02-11 11:30:40 +01:00
|
|
|
}
|
2018-02-20 10:50:46 +01:00
|
|
|
|
2018-02-11 11:30:40 +01:00
|
|
|
client.stateMutex.Lock()
|
|
|
|
defer client.stateMutex.Unlock()
|
2018-02-20 10:50:46 +01:00
|
|
|
changed = client.account != casefoldedAccount
|
2018-02-11 11:30:40 +01:00
|
|
|
client.account = casefoldedAccount
|
|
|
|
client.accountName = account
|
2018-02-20 10:50:46 +01:00
|
|
|
return
|
2017-11-09 04:19:50 +01:00
|
|
|
}
|
|
|
|
|
2018-02-27 03:44:03 +01:00
|
|
|
func (client *Client) Authorized() bool {
|
|
|
|
client.stateMutex.RLock()
|
|
|
|
defer client.stateMutex.RUnlock()
|
|
|
|
return client.authorized
|
|
|
|
}
|
|
|
|
|
|
|
|
func (client *Client) SetAuthorized(authorized bool) {
|
|
|
|
client.stateMutex.Lock()
|
|
|
|
defer client.stateMutex.Unlock()
|
|
|
|
client.authorized = authorized
|
|
|
|
}
|
|
|
|
|
|
|
|
func (client *Client) PreregNick() string {
|
|
|
|
client.stateMutex.RLock()
|
|
|
|
defer client.stateMutex.RUnlock()
|
|
|
|
return client.preregNick
|
|
|
|
}
|
|
|
|
|
|
|
|
func (client *Client) SetPreregNick(preregNick string) {
|
|
|
|
client.stateMutex.Lock()
|
|
|
|
defer client.stateMutex.Unlock()
|
|
|
|
client.preregNick = preregNick
|
|
|
|
}
|
|
|
|
|
2018-02-03 11:21:32 +01:00
|
|
|
func (client *Client) HasMode(mode modes.Mode) bool {
|
2017-10-23 01:50:16 +02:00
|
|
|
client.stateMutex.RLock()
|
|
|
|
defer client.stateMutex.RUnlock()
|
|
|
|
return client.flags[mode]
|
|
|
|
}
|
|
|
|
|
|
|
|
func (client *Client) Channels() (result []*Channel) {
|
|
|
|
client.stateMutex.RLock()
|
|
|
|
defer client.stateMutex.RUnlock()
|
|
|
|
length := len(client.channels)
|
|
|
|
result = make([]*Channel, length)
|
|
|
|
i := 0
|
|
|
|
for channel := range client.channels {
|
|
|
|
result[i] = channel
|
|
|
|
i++
|
|
|
|
}
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
func (channel *Channel) Name() string {
|
|
|
|
channel.stateMutex.RLock()
|
|
|
|
defer channel.stateMutex.RUnlock()
|
|
|
|
return channel.name
|
|
|
|
}
|
|
|
|
|
2017-10-30 10:21:47 +01:00
|
|
|
func (channel *Channel) setName(name string) {
|
|
|
|
channel.stateMutex.Lock()
|
|
|
|
defer channel.stateMutex.Unlock()
|
|
|
|
channel.name = name
|
|
|
|
}
|
|
|
|
|
|
|
|
func (channel *Channel) NameCasefolded() string {
|
|
|
|
channel.stateMutex.RLock()
|
|
|
|
defer channel.stateMutex.RUnlock()
|
|
|
|
return channel.nameCasefolded
|
|
|
|
}
|
|
|
|
|
|
|
|
func (channel *Channel) setNameCasefolded(nameCasefolded string) {
|
|
|
|
channel.stateMutex.Lock()
|
|
|
|
defer channel.stateMutex.Unlock()
|
|
|
|
channel.nameCasefolded = nameCasefolded
|
|
|
|
}
|
|
|
|
|
2017-10-23 01:50:16 +02:00
|
|
|
func (channel *Channel) Members() (result []*Client) {
|
|
|
|
channel.stateMutex.RLock()
|
|
|
|
defer channel.stateMutex.RUnlock()
|
|
|
|
return channel.membersCache
|
|
|
|
}
|
|
|
|
|
|
|
|
func (channel *Channel) UserLimit() uint64 {
|
|
|
|
channel.stateMutex.RLock()
|
|
|
|
defer channel.stateMutex.RUnlock()
|
|
|
|
return channel.userLimit
|
|
|
|
}
|
|
|
|
|
|
|
|
func (channel *Channel) setUserLimit(limit uint64) {
|
|
|
|
channel.stateMutex.Lock()
|
|
|
|
channel.userLimit = limit
|
|
|
|
channel.stateMutex.Unlock()
|
|
|
|
}
|
|
|
|
|
|
|
|
func (channel *Channel) Key() string {
|
|
|
|
channel.stateMutex.RLock()
|
|
|
|
defer channel.stateMutex.RUnlock()
|
|
|
|
return channel.key
|
|
|
|
}
|
|
|
|
|
|
|
|
func (channel *Channel) setKey(key string) {
|
|
|
|
channel.stateMutex.Lock()
|
2018-04-04 03:49:40 +02:00
|
|
|
defer channel.stateMutex.Unlock()
|
2017-10-23 01:50:16 +02:00
|
|
|
channel.key = key
|
|
|
|
}
|
|
|
|
|
2018-02-03 11:21:32 +01:00
|
|
|
func (channel *Channel) HasMode(mode modes.Mode) bool {
|
2017-10-23 01:50:16 +02:00
|
|
|
channel.stateMutex.RLock()
|
|
|
|
defer channel.stateMutex.RUnlock()
|
|
|
|
return channel.flags[mode]
|
|
|
|
}
|
|
|
|
|
2017-11-09 04:19:50 +01:00
|
|
|
func (channel *Channel) Founder() string {
|
|
|
|
channel.stateMutex.RLock()
|
|
|
|
defer channel.stateMutex.RUnlock()
|
|
|
|
return channel.registeredFounder
|
|
|
|
}
|
|
|
|
|
2017-10-23 01:50:16 +02:00
|
|
|
// set a channel mode, return whether it was already set
|
2018-02-03 11:21:32 +01:00
|
|
|
func (channel *Channel) setMode(mode modes.Mode, enable bool) (already bool) {
|
2017-10-23 01:50:16 +02:00
|
|
|
channel.stateMutex.Lock()
|
|
|
|
already = (channel.flags[mode] == enable)
|
|
|
|
if !already {
|
|
|
|
if enable {
|
|
|
|
channel.flags[mode] = true
|
|
|
|
} else {
|
|
|
|
delete(channel.flags, mode)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
channel.stateMutex.Unlock()
|
|
|
|
return
|
|
|
|
}
|