github.ccut.club/rafael-santiago/cherry@v0.0.0-20161214151746-8ea42c6e9670/src/pkg/messageplexer/messageplexer.go (about) 1 /* 2 Package messageplexer is the part responsible for messages delivering on Cherry. 3 -- 4 * Copyright (C) 2015 by Rafael Santiago 5 * 6 * This is a free software. You can redistribute it and/or modify under 7 * the terms of the GNU General Public License version 2. 8 * 9 */ 10 package messageplexer 11 12 import ( 13 "net" 14 "pkg/config" 15 "pkg/html" 16 "runtime" 17 ) 18 19 // RoomMessagePlexer performs all message delivering stuff. 20 func RoomMessagePlexer(roomName string, rooms *config.CherryRooms) { 21 preprocessor := html.NewHTMLPreprocessor(rooms) 22 var allUsers = rooms.GetAllUsersAlias(roomName) 23 for { 24 runtime.Gosched() 25 currMessage := rooms.GetNextMessage(roomName) 26 if len(currMessage.Say) == 0 && len(currMessage.Image) == 0 /*&& len(currMessage.Sound) == 0*/ { 27 continue 28 } 29 var actionTemplate string 30 if rooms.HasAction(roomName, currMessage.Action) { 31 actionTemplate = rooms.GetRoomActionTemplate(roomName, currMessage.Action) 32 } 33 if len(actionTemplate) == 0 { 34 actionTemplate = "<p>({{.hour}}:{{.minute}}:{{.second}}) <b>{{.message-colored-user}}</b>: {{.message-says}}" // INFO(Santiago): A very basic action template. 35 } 36 message := preprocessor.ExpandData(roomName, actionTemplate) 37 if currMessage.Priv != "1" { 38 rooms.AddPublicMessage(roomName, message) 39 } 40 preprocessor.SetDataValue("{{.current-formatted-message}}", message) 41 messageHighlighted := preprocessor.ExpandData(roomName, rooms.GetHighlightTemplate(roomName)) 42 preprocessor.UnsetDataValue("{{.current-formatted-message}}") 43 users := rooms.GetRoomUsers(roomName) 44 for _, user := range users { 45 if currMessage.Priv == "1" && 46 user != currMessage.From && 47 user != currMessage.To && 48 currMessage.To != allUsers { 49 continue 50 } 51 if rooms.IsIgnored(user, currMessage.From, roomName) { 52 continue 53 } 54 var messageBuffer []byte 55 if user == currMessage.From || 56 user == currMessage.To { 57 messageBuffer = []byte(messageHighlighted) 58 } else { 59 messageBuffer = []byte(message) 60 } 61 var conn net.Conn 62 conn = rooms.GetUserConnection(roomName, user) 63 if conn == nil { 64 continue 65 } 66 _, e := conn.Write(messageBuffer) 67 if e != nil { 68 rooms.EnqueueMessage(roomName, user, "", "", "", rooms.GetExitMessage(roomName), "") 69 rooms.RemoveUser(roomName, user) 70 } 71 } 72 rooms.DequeueMessage(roomName) 73 } 74 }