Parcourir la source

clean up /theater so that it doesn't need a bunch of pointers and that it reuses channel-scoped-user-modes machinery

tags/v0.1.0
Edmund Huber il y a 10 ans
Parent
révision
6267b6a40c
5 fichiers modifiés avec 14 ajouts et 16 suppressions
  1. 0
    4
      irc/channel.go
  2. 0
    5
      irc/client.go
  3. 1
    1
      irc/modes.go
  4. 4
    6
      irc/theater.go
  5. 9
    0
      irc/types.go

+ 0
- 4
irc/channel.go Voir le fichier

@@ -14,7 +14,6 @@ type Channel struct {
14 14
 	server      *Server
15 15
 	topic       Text
16 16
 	userLimit   uint64
17
-	theaterUser *Client
18 17
 }
19 18
 
20 19
 // NewChannel creates a new channel from a `Server` and a `name`
@@ -406,9 +405,6 @@ func (channel *Channel) applyMode(client *Client, change *ChannelModeChange) boo
406 405
 		return channel.applyModeMember(client, change.mode, change.op,
407 406
 			NewName(change.arg))
408 407
 
409
-	case Theater:
410
-		client.ErrConfiguredMode(change.mode)
411
-
412 408
 	default:
413 409
 		client.ErrUnknownMode(change.mode, channel)
414 410
 	}

+ 0
- 5
irc/client.go Voir le fichier

@@ -34,7 +34,6 @@ type Client struct {
34 34
 	server          *Server
35 35
 	socket          *Socket
36 36
 	username        Name
37
-	theaterChannels []*Channel
38 37
 }
39 38
 
40 39
 func NewClient(server *Server, conn net.Conn) *Client {
@@ -260,10 +259,6 @@ func (client *Client) Quit(message Text) {
260 259
 		return
261 260
 	}
262 261
 
263
-	for _, channel := range client.theaterChannels {
264
-		delete(channel.flags, Theater)
265
-	}
266
-
267 262
 	client.Reply(RplError("connection closed"))
268 263
 	client.hasQuit = true
269 264
 	client.server.whoWas.Append(client)

+ 1
- 1
irc/modes.go Voir le fichier

@@ -83,7 +83,7 @@ const (
83 83
 	Quiet           ChannelMode = 'q' // flag
84 84
 	ReOp            ChannelMode = 'r' // flag
85 85
 	Secret          ChannelMode = 's' // flag, deprecated
86
-	Theater         ChannelMode = 'T' // flag arg, nonstandard
86
+	Theater         ChannelMode = 'T' // flag, nonstandard
87 87
 	UserLimit       ChannelMode = 'l' // flag arg
88 88
 	Voice           ChannelMode = 'v' // arg
89 89
 )

+ 4
- 6
irc/theater.go Voir le fichier

@@ -51,10 +51,8 @@ func (m *TheaterIdentifyCommand) HandleServer(s *Server) {
51 51
 		return
52 52
 	}
53 53
 
54
-	if channel.theaterUser == nil {
55
-		client.theaterChannels = append(client.theaterChannels, channel)
56
-		channel.flags[Theater] = true
57
-		channel.theaterUser = client
54
+	if !channel.members.AnyHasMode(Theater) {
55
+		channel.members[client][Theater] = true
58 56
 	}
59 57
 }
60 58
 
@@ -82,7 +80,7 @@ func (m *TheaterPrivMsgCommand) HandleServer(s *Server) {
82 80
 		return
83 81
 	}
84 82
 
85
-	if channel.theaterUser == client {
83
+	if channel.members.HasMode(client, Theater) {
86 84
 		for member := range channel.members {
87 85
 			member.Reply(RplPrivMsg(TheaterClient(m.asNick), channel, m.message))
88 86
 		}
@@ -113,7 +111,7 @@ func (m *TheaterActionCommand) HandleServer(s *Server) {
113 111
 		return
114 112
 	}
115 113
 
116
-	if channel.theaterUser == client {
114
+	if channel.members.HasMode(client, Theater) {
117 115
 		for member := range channel.members {
118 116
 			member.Reply(RplPrivMsg(TheaterClient(m.asNick), channel, NewText(fmt.Sprintf("\001ACTION %s\001", m.action))))
119 117
 		}

+ 9
- 0
irc/types.go Voir le fichier

@@ -83,6 +83,15 @@ func (members MemberSet) HasMode(member *Client, mode ChannelMode) bool {
83 83
 	return modes[mode]
84 84
 }
85 85
 
86
+func (members MemberSet) AnyHasMode(mode ChannelMode) bool {
87
+	for _, modes := range members {
88
+		if modes[Theater] {
89
+			return true
90
+		}
91
+	}
92
+	return false
93
+}
94
+
86 95
 type ChannelSet map[*Channel]bool
87 96
 
88 97
 func (channels ChannelSet) Add(channel *Channel) {

Chargement…
Annuler
Enregistrer