/
user.go
82 lines (67 loc) · 1.67 KB
/
user.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
package main
import (
"fmt"
"time"
log "github.com/Sirupsen/logrus"
"github.com/tideland/golib/cells"
"github.com/tideland/golib/identifier"
)
type user struct {
nullBehavior
name string
ctx cells.Context
}
func newUser(name string) *user {
u := &user{name: name}
return u
}
func makeUserID(name string) string {
return identifier.Identifier("user", name)
}
func (u *user) Init(ctx cells.Context) (err error) {
u.ctx = ctx
return
}
func (u *user) ProcessEvent(event cells.Event) error {
switch event.Topic() {
case SAYS_TO:
to, ok := event.Payload().Get("to")
if !ok || to.(string) != makeUserID(u.name) {
return nil
}
log.Info(event.Payload())
case SAY:
env := u.ctx.Environment()
roomID, _ := event.Payload().Get("room")
if !env.HasCell(roomID.(string)) {
log.Panicf("%s not found", roomID)
return fmt.Errorf("room %s not found", roomID)
}
ok, err := env.Request(roomID.(string), IN_ROOM, cells.PayloadValues{"user": makeUserID(u.name)}, nil, time.Second)
if err != nil {
log.Panic(err)
return err
}
if !ok.(bool) {
return fmt.Errorf("%s is not in %s", u.name, roomID)
}
payload := event.Payload()
payload = payload.Apply(cells.PayloadValues{"from": makeUserID(u.name)})
env.EmitNew(roomID.(string), SAYS_ALL, payload, nil)
case USER_DISCONNECTED:
log.Info(USER_DISCONNECTED)
}
return nil
}
type logUser struct {
user
}
func (lu *logUser) ProcessEvent(event cells.Event) (err error) {
// TODO: would be nice to have an event.Source()
if event.Topic() == SAYS_ALL {
user, _ := event.Payload().Get("from")
msg, _ := event.Payload().Get("message")
log.Infof("%s heard %v say \"%v\"", lu.name, user, msg)
}
return
}