roles.go 2.6 KB
Newer Older
P
peterq 已提交
1 2 3 4
package rpc

import (
	"github.com/peterq/pan-light/server/realtime"
5
	"math/rand"
P
peterq 已提交
6 7 8 9 10
	"sync"
)

type roleType interface {
	roleName() string
P
peterq 已提交
11
	publicInfo() gson
P
peterq 已提交
12 13 14
}

type roleHost struct {
15 16 17 18
	name       string
	session    *realtime.Session
	wsAgentUrl string
	slaves     map[string]*roleSlave
P
peterq 已提交
19 20
}

P
peterq 已提交
21 22 23 24
func (*roleHost) publicInfo() gson {
	panic("implement me")
}

P
peterq 已提交
25 26 27 28 29 30 31
func (*roleHost) roleName() string {
	return "host"
}

type roleUser struct {
	session *realtime.Session

P
peterq 已提交
32
	nickname string // 随机分配花名
P
peterq 已提交
33
	avatar   string // 随机分配花名
P
peterq 已提交
34

P
peterq 已提交
35 36 37
	waitState *waitState
}

P
peterq 已提交
38
func (user *roleUser) publicInfo() gson {
P
peterq 已提交
39 40
	return gson{
		"nickname": user.nickname,
P
peterq 已提交
41
		"avatar":   user.avatar,
P
peterq 已提交
42
	}
P
peterq 已提交
43 44
}

P
peterq 已提交
45 46 47 48
func (*roleUser) roleName() string {
	return "user"
}

49
func (user *roleUser) requestTicket() (data gson, err error) {
P
peterq 已提交
50
	if user.waitState == nil {
51
		manager.waitSessionMapLock.Lock()
P
peterq 已提交
52
		defer manager.waitSessionMapLock.Unlock()
53 54 55 56 57 58 59 60 61 62
		manager.lastDistributedOrder++
		w := &waitState{
			ticket:  randomStr(32),
			order:   manager.lastDistributedOrder,
			session: user.session,
		}
		manager.waitSessionMap[manager.lastDistributedOrder] = w
		user.waitState = w
		server.RoomByName("room.all.host").Broadcast("wait.user.new", nil)
	}
P
peterq 已提交
63 64 65 66
	data = gson{
		"order":  user.waitState.order,
		"ticket": user.waitState.ticket,
	}
67 68 69
	return
}

P
peterq 已提交
70 71 72 73 74
type slaveState string

const (
	slaveStateWait     slaveState = "wait"
	slaveStateStarting slaveState = "starting"
P
peterq 已提交
75
	slaveStateRunning  slaveState = "running"
P
peterq 已提交
76 77
)

P
peterq 已提交
78
type roleSlave struct {
P
peterq 已提交
79 80 81 82
	name          string            // slave 名称, 需要已host名称为前缀, 用来鉴权
	host          *roleHost         // 指向host
	session       *realtime.Session // slave 进程链接的session
	userWaitState *waitState        // 用户排队票据
P
peterq 已提交
83 84
	startTime     int               // 启动时间
	endTime       int               // 结束时间
P
peterq 已提交
85 86
	state         slaveState
	lock          sync.Mutex
P
peterq 已提交
87 88
}

P
peterq 已提交
89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107
func (slave *roleSlave) publicInfo() gson {
	return gson{
		"slaveName":    slave.name,
		"visitorCount": server.RoomByName("room.slave.all.user." + slave.name).Count(),
		"state":        slave.state,
		"startTime":    slave.startTime,
		"endTime":      slave.endTime,
		"user": func() interface{} {
			if slave.userWaitState != nil {
				return gson{
					"order":     slave.userWaitState.order,
					"sessionId": slave.userWaitState.session.Id(),
				}
			}
			return nil
		}(),
	}
}

P
peterq 已提交
108 109 110
func (*roleSlave) roleName() string {
	return "slave"
}
111

P
peterq 已提交
112 113
func randomStr(length int) string {
	arr := make([]byte, length)
114
	src := "qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM1234567890"
P
peterq 已提交
115
	for i := 0; i < length; i++ {
116 117 118 119
		arr[i] = byte(src[rand.Intn(len(src))])
	}
	return string(arr)
}