2bd612da48
It is now necessary, that every command sends an answer.
56 lines
1.9 KiB
Go
56 lines
1.9 KiB
Go
package ICCC
|
|
|
|
import (
|
|
"github.com/SommerEngineering/Ocean/ICCC/Scheme"
|
|
"github.com/SommerEngineering/Ocean/Log"
|
|
LM "github.com/SommerEngineering/Ocean/Log/Meta"
|
|
"github.com/SommerEngineering/Ocean/Tools"
|
|
)
|
|
|
|
// Function to write a message to any listener.
|
|
func WriteMessage2Any(channel, command string, message interface{}, answerPrototype interface{}) (result interface{}) {
|
|
cacheListenerDatabaseLock.RLock()
|
|
defer cacheListenerDatabaseLock.RUnlock()
|
|
|
|
// Convert the message to HTTP data:
|
|
data := Message2Data(channel, command, message)
|
|
maxCount := cacheListenerDatabase.Len()
|
|
entries := make([]Scheme.Listener, 0, maxCount)
|
|
counter := 0
|
|
|
|
// Loop over all listeners which are currently present at the cache:
|
|
for entry := cacheListenerDatabase.Front(); entry != nil; entry = entry.Next() {
|
|
listener := entry.Value.(Scheme.Listener)
|
|
|
|
// If the channel and the command matches, store the listener:
|
|
if listener.Channel == channel && listener.Command == command {
|
|
entries = entries[:len(entries)+1]
|
|
entries[counter] = listener
|
|
}
|
|
}
|
|
|
|
count := len(entries)
|
|
if count > 0 {
|
|
//
|
|
// Case: Find at least one possible listener.
|
|
//
|
|
|
|
// Case: There is only 1 listener
|
|
if len(entries) == 1 {
|
|
listener := entries[0]
|
|
answersData := sendMessage(listener, data)
|
|
_, _, result = Data2Message(answerPrototype, answersData)
|
|
} else {
|
|
// Case: Multiple listeners are available. Choose a random one and deliver:
|
|
listener := entries[Tools.RandomInteger(count)]
|
|
answersData := sendMessage(listener, data)
|
|
_, _, result = Data2Message(answerPrototype, answersData)
|
|
}
|
|
} else {
|
|
// Case: Find no listener at all.
|
|
Log.LogFull(senderName, LM.CategorySYSTEM, LM.LevelWARN, LM.SeverityCritical, LM.ImpactUnknown, LM.MessageNameCONFIGURATION, `It was not able to deliver this message to any listener, because no listener was found!`, `channel=`+channel, `command=`+command)
|
|
}
|
|
|
|
return
|
|
}
|