github.com/dolotech/hongbao@v0.0.0-20191130105438-fd59d7a5dda5/src/logic/websocket_client.go (about) 1 package logic 2 3 import ( 4 "data" 5 "fmt" 6 "github.com/golang/glog" 7 "github.com/gorilla/websocket" 8 jsoniter "github.com/json-iterator/go" 9 "log" 10 "math/rand" 11 "net/url" 12 "strconv" 13 "sync" 14 "time" 15 "utils/cfg" 16 ) 17 18 const ( 19 pongWait = 3 * time.Second 20 ) 21 22 type Resp struct { 23 Code string `json:"code"` 24 Honbao data.HonbaoTbs `json:"honbao"` 25 Honbaos data.HonbaosTbs `json:"honbaos"` 26 } 27 28 type Float float64 29 30 func (this Float) Last() int { 31 s := this.String() 32 l := s[len(s)-1:] 33 i, _ := strconv.Atoi(l) 34 return i 35 } 36 37 func (this Float) String() string { 38 return fmt.Sprintf("%.2f", this) 39 } 40 41 var syc sync.Map 42 43 func Websocet(cookies cfg.Cookies) { 44 u := url.URL{Scheme: "ws", Host: cookies.Address, Path: "/"} 45 log.Printf("connecting to %s", u.String()) 46 47 c, _, err := websocket.DefaultDialer.Dial(u.String(), nil) 48 if err != nil { 49 log.Fatal("dial:", err) 50 } 51 defer c.Close() 52 53 for { 54 c.SetReadDeadline(time.Now().Add(pongWait)) 55 _, message, err := c.ReadMessage() 56 if err != nil { 57 glog.Info("read:", err) 58 return 59 } 60 61 r := rand.Int31n(int32(len(cookies.Cookie))) 62 63 ParseData(message, cookies.API,cookies.Cookie[r]) 64 } 65 } 66 67 func ParseData(message []byte,addr ,cookie string) { 68 any := jsoniter.Get(message) 69 70 if any.Get("code").ToString() == "ok" { 71 d := &Resp{} 72 any.ToVal(d) 73 74 honbao := d.Honbao 75 honbaos := d.Honbaos 76 //go honbao.Save() 77 //go honbaos.Save() 78 79 for i := 0; i < len(honbao); i++ { 80 v := honbao[i] 81 //glog.Info(v.Number) 82 count:=0 83 leiCount:=0 84 var moneyLeft float64 85 for _, value := range honbaos { 86 if value.HbId == v.Id { 87 moneyLeft += value.GetMoney() 88 count ++ 89 } 90 if value.Zlei == 1&& "dbca9"!=value.Uid{ 91 //glog.Info(value.Nickname,value.Uid) 92 leiCount = 1 93 break 94 } 95 } 96 97 //抢包处理 98 //if count==5{ 99 if leiCount==1{ 100 if _, ok := syc.Load(v.Id); !ok { 101 syc.Store(v.Id, struct{}{}) 102 money := v.GetMoney() 103 if Float(money - moneyLeft).Last() != v.Lei { 104 //r := rand.Int31n(int32(len(cookies.Cookie))) 105 //time.AfterFunc(time.Millisecond*100, func() { 106 go Http(addr, strconv.Itoa(int(v.Id)),cookie,v) 107 //}) 108 } 109 } 110 } 111 } 112 } 113 }