123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165 |
- package irc
-
- import (
- "strings"
- )
-
- // user mode flags
- type UserMode rune
-
- func (mode UserMode) String() string {
- return string(mode)
- }
-
- type UserModes []UserMode
-
- func (modes UserModes) String() string {
- strs := make([]string, len(modes))
- for index, mode := range modes {
- strs[index] = mode.String()
- }
- return strings.Join(strs, "")
- }
-
- // channel mode flags
- type ChannelMode rune
-
- func (mode ChannelMode) String() string {
- return string(mode)
- }
-
- type ChannelModes []ChannelMode
-
- func (modes ChannelModes) String() string {
- strs := make([]string, len(modes))
- for index, mode := range modes {
- strs[index] = mode.String()
- }
- return strings.Join(strs, "")
- }
-
- type ModeOp rune
-
- func (op ModeOp) String() string {
- return string(op)
- }
-
- const (
- Add ModeOp = '+'
- List ModeOp = '='
- Remove ModeOp = '-'
- )
-
- const (
- Away UserMode = 'a'
- Invisible UserMode = 'i'
- LocalOperator UserMode = 'O'
- Operator UserMode = 'o'
- Restricted UserMode = 'r'
- ServerNotice UserMode = 's' // deprecated
- WallOps UserMode = 'w'
- )
-
- var (
- SupportedUserModes = UserModes{
- Away, Invisible, Operator,
- }
- )
-
- const (
- Anonymous ChannelMode = 'a' // flag
- BanMask ChannelMode = 'b' // arg
- ChannelCreator ChannelMode = 'O' // flag
- ChannelOperator ChannelMode = 'o' // arg
- ExceptMask ChannelMode = 'e' // arg
- InviteMask ChannelMode = 'I' // arg
- InviteOnly ChannelMode = 'i' // flag
- Key ChannelMode = 'k' // flag arg
- Moderated ChannelMode = 'm' // flag
- NoOutside ChannelMode = 'n' // flag
- OpOnlyTopic ChannelMode = 't' // flag
- Persistent ChannelMode = 'P' // flag
- Private ChannelMode = 'p' // flag
- Quiet ChannelMode = 'q' // flag
- ReOp ChannelMode = 'r' // flag
- Secret ChannelMode = 's' // flag, deprecated
- Theater ChannelMode = 'T' // flag, nonstandard
- UserLimit ChannelMode = 'l' // flag arg
- Voice ChannelMode = 'v' // arg
- )
-
- var (
- SupportedChannelModes = ChannelModes{
- BanMask, ExceptMask, InviteMask, InviteOnly, Key, NoOutside,
- OpOnlyTopic, Persistent, Private, Theater, UserLimit,
- }
- )
-
- //
- // commands
- //
-
- func (m *ModeCommand) HandleServer(s *Server) {
- client := m.Client()
- target := s.clients.Get(m.nickname)
-
- if target == nil {
- client.ErrNoSuchNick(m.nickname)
- return
- }
-
- if client != target && !client.flags[Operator] {
- client.ErrUsersDontMatch()
- return
- }
-
- changes := make(ModeChanges, 0, len(m.changes))
-
- for _, change := range m.changes {
- switch change.mode {
- case Invisible, ServerNotice, WallOps:
- switch change.op {
- case Add:
- if target.flags[change.mode] {
- continue
- }
- target.flags[change.mode] = true
- changes = append(changes, change)
-
- case Remove:
- if !target.flags[change.mode] {
- continue
- }
- delete(target.flags, change.mode)
- changes = append(changes, change)
- }
-
- case Operator, LocalOperator:
- if change.op == Remove {
- if !target.flags[change.mode] {
- continue
- }
- delete(target.flags, change.mode)
- changes = append(changes, change)
- }
- }
- }
-
- if len(changes) > 0 {
- client.Reply(RplModeChanges(client, target, changes))
- } else if client == target {
- client.RplUModeIs(client)
- }
- client.Reply(RplCurrentMode(client, target))
- }
-
- func (msg *ChannelModeCommand) HandleServer(server *Server) {
- client := msg.Client()
- channel := server.channels.Get(msg.channel)
- if channel == nil {
- client.ErrNoSuchChannel(msg.channel)
- return
- }
-
- channel.Mode(client, msg.changes)
- }
|