]> Cypherpunks.ru repositories - goircd.git/blobdiff - room.go
Fix several races
[goircd.git] / room.go
diff --git a/room.go b/room.go
index f58d70845d3a0277b43fc5181ffbfb43b408e422..6fc2bcaa94b8b072858c7afd59d5d17f22f6b0f8 100644 (file)
--- a/room.go
+++ b/room.go
@@ -25,25 +25,28 @@ import (
        "strings"
 )
 
+var (
+       RE_ROOM = regexp.MustCompile("^#[^\x00\x07\x0a\x0d ,:/]{1,200}$")
+)
+
 // Sanitize room's name. It can consist of 1 to 50 ASCII symbols
 // with some exclusions. All room names will have "#" prefix.
-func RoomNameSanitize(name string) (n string, valid bool) {
-       n = strings.TrimLeft(strings.ToLower(name), "&#+!")
-       valid, _ = regexp.MatchString("^[^\x00\x07\x0a\x0d ,:/]{1,50}$", n)
-       return "#" + n, valid
+func RoomNameValid(name string) bool {
+       return RE_ROOM.MatchString(name)
 }
 
 type Room struct {
+       Verbose    bool
        name       string
        topic      string
        key        string
        members    map[*Client]bool
        hostname   string
-       log_sink   chan LogEvent
-       state_sink chan StateEvent
+       log_sink   chan<- LogEvent
+       state_sink chan<- StateEvent
 }
 
-func NewRoom(hostname, name string, log_sink chan LogEvent, state_sink chan StateEvent) *Room {
+func NewRoom(hostname, name string, log_sink chan<- LogEvent, state_sink chan<- StateEvent) *Room {
        room := Room{name: name}
        room.members = make(map[*Client]bool)
        room.topic = ""
@@ -76,16 +79,18 @@ func (room *Room) StateSave() {
        room.state_sink <- StateEvent{room.name, room.topic, room.key}
 }
 
-func (room *Room) Processor(events chan ClientEvent) {
+func (room *Room) Processor(events <-chan ClientEvent) {
        var client *Client
        for event := range events {
                client = event.client
                switch event.event_type {
                case EVENT_NEW:
                        room.members[client] = true
-                       log.Println(client, "joined", room.name)
+                       if room.Verbose {
+                               log.Println(client, "joined", room.name)
+                       }
                        room.SendTopic(client)
-                       go room.Broadcast(fmt.Sprintf(":%s JOIN %s", client, room.name))
+                       room.Broadcast(fmt.Sprintf(":%s JOIN %s", client, room.name))
                        room.log_sink <- LogEvent{room.name, client.nickname, "joined", true}
                        nicknames := []string{}
                        for member := range room.members {
@@ -101,7 +106,7 @@ func (room *Room) Processor(events chan ClientEvent) {
                        }
                        delete(room.members, client)
                        msg := fmt.Sprintf(":%s PART %s :%s", client, room.name, client.nickname)
-                       go room.Broadcast(msg)
+                       room.Broadcast(msg)
                        room.log_sink <- LogEvent{room.name, client.nickname, "left", true}
                case EVENT_TOPIC:
                        if _, subscribed := room.members[client]; !subscribed {
@@ -121,7 +126,7 @@ func (room *Room) Processor(events chan ClientEvent) {
                        for m := range room.members {
                                client.ReplyNicknamed("352", room.name, m.username, m.conn.RemoteAddr().String(), room.hostname, m.nickname, "H", "0 "+m.realname)
                        }
-                       client.ReplyNicknamed("315", room.name, "End of WHO list")
+                       client.ReplyNicknamed("315", room.name, "End of /WHO list")
                case EVENT_MODE:
                        if event.text == "" {
                                mode := "+"
@@ -161,7 +166,7 @@ func (room *Room) Processor(events chan ClientEvent) {
                        room.StateSave()
                case EVENT_MSG:
                        sep := strings.Index(event.text, " ")
-                       go room.Broadcast(fmt.Sprintf(":%s %s %s :%s", client, event.text[:sep], room.name, event.text[sep+1:]), client)
+                       room.Broadcast(fmt.Sprintf(":%s %s %s :%s", client, event.text[:sep], room.name, event.text[sep+1:]), client)
                        room.log_sink <- LogEvent{room.name, client.nickname, event.text[sep+1:], false}
                }
        }