4 "github.com/Shopify/go-lua"
5 "github.com/anon55555/mt"
10 func l_poll(l *lua.State) int {
11 clients := make([]*Client, 0)
13 lua.CheckType(l, 1, lua.TypeTable)
22 clients = append(clients, l.ToUserData(-1).(*Client))
26 var timeout time.Duration
29 timeout = time.Duration(lua.CheckNumber(l, 3) * float64(time.Second))
34 cases := make([]reflect.SelectCase, 0, len(clients)+2)
36 for _, client := range clients {
37 if client.state != csConnected {
41 cases = append(cases, reflect.SelectCase{
42 Dir: reflect.SelectRecv,
43 Chan: reflect.ValueOf(client.queue),
54 cases = append(cases, reflect.SelectCase{
55 Dir: reflect.SelectRecv,
56 Chan: reflect.ValueOf(signalChannel()),
60 cases = append(cases, reflect.SelectCase{
61 Dir: reflect.SelectRecv,
62 Chan: reflect.ValueOf(time.After(timeout)),
66 idx, value, ok := reflect.Select(cases)
73 client := clients[idx]
77 pkt = value.Interface().(*mt.Pkt)
79 client.state = csDisconnected
82 for _, handler := range client.handlers {
83 handler.handle(pkt, l, idx+1)