0
0
Fork 0
This repository has been archived on 2024-05-09. You can view files and clone it, but you cannot make any changes to its state, such as pushing and creating new issues, pull requests or comments.
game-server/pkg/event/event.go
2018-09-18 08:35:41 -05:00

87 lines
1.8 KiB
Go

package event
import (
"encoding/json"
"fmt"
"strings"
log "github.com/Sirupsen/logrus"
)
type General struct {
Event string
Payload map[string]interface{}
}
// Looking to be able to quickly split/send message event types/channels to the respective modules and marshalling everything else into a map.
func (g *General) MarshalJSON() ([]byte, error) {
e := map[string]interface{}{}
if g.Event != "" {
if c, ok := e["event"]; ok {
e["event"] = fmt.Sprintf("%s:%s", g.Event, c)
} else {
e["event"] = g.Event
}
}
for k, v := range g.Payload {
e[k] = v
}
if b, err := json.Marshal(e); err == nil {
return b, nil
}
return []byte(""), nil
}
func (g *General) UnmarshalJSON(b []byte) error {
var m map[string]interface{}
if err := json.Unmarshal(b, &m); err != nil {
return err
}
if g.Payload == nil {
g.Payload = map[string]interface{}{}
}
for k, v := range m {
if k == "event" {
if e, ok := m["event"].(string); ok {
events := strings.Split(e, ":")
g.Event = events[0]
if len(events) > 1 {
g.Payload["event"] = strings.Join(events[1:], ":")
}
}
} else {
g.Payload[k] = v
}
}
return nil
}
func WrapError(err error) []byte {
msg, merr := json.Marshal(&General{
Event: "ERROR",
Payload: map[string]interface{}{
"error": err.Error(),
},
})
if merr != nil {
log.Errorf("error wrapping err.Error() %s", err.Error())
return []byte(``)
}
return msg
}
func WrapValues(t string, keyvalues map[string]interface{}) []byte {
msg, err := json.Marshal(&General{
Event: t,
Payload: keyvalues,
})
if err != nil {
log.Errorf("error wrapping keyvalues %v", keyvalues)
return []byte(``)
}
return msg
}
func WrapValue(t string, key, value string) []byte {
return WrapValues(t, map[string]interface{}{key: value})
}