X-Git-Url: http://www.git.cypherpunks.ru/?p=goircd.git;a=blobdiff_plain;f=room.go;h=6fc2bcaa94b8b072858c7afd59d5d17f22f6b0f8;hp=f58d70845d3a0277b43fc5181ffbfb43b408e422;hb=def74ddc09249de9ab72001bb00550863d7f27e6;hpb=b2f90fb412218973608b24a32eebadc60de9878a diff --git a/room.go b/room.go index f58d708..6fc2bca 100644 --- 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} } }