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  }