This commit is contained in:
poiuty 2023-06-09 14:58:41 +03:00
parent c22576a6bf
commit eedc77518a
3 changed files with 48 additions and 45 deletions

View file

@ -16,6 +16,7 @@ type Info struct {
ch chan struct{} ch chan struct{}
room string room string
Server string `json:"server"` Server string `json:"server"`
Params string `json:"params"`
Proxy string `json:"proxy"` Proxy string `json:"proxy"`
Online string `json:"online"` Online string `json:"online"`
Rid int64 `json:"rid"` Rid int64 `json:"rid"`
@ -71,11 +72,12 @@ func cmdHandler(w http.ResponseWriter, r *http.Request) {
return return
} }
params := r.URL.Query() params := r.URL.Query()
if len(params["room"]) > 0 && len(params["server"]) > 0 && len(params["proxy"]) > 0 { if len(params["room"]) > 0 && len(params["server"]) > 0 && len(params["proxy"]) > 0 && len(params["params"]) > 0 {
now := time.Now().Unix() now := time.Now().Unix()
workerData := Info{ workerData := Info{
room: params["room"][0], room: params["room"][0],
Server: params["server"][0], Server: params["server"][0],
Params: params["params"][0],
Proxy: params["proxy"][0], Proxy: params["proxy"][0],
Online: "0", Online: "0",
Start: now, Start: now,

View file

@ -3,7 +3,6 @@ package main
import ( import (
"fmt" "fmt"
"log" "log"
"math/rand"
"net" "net"
"net/http" "net/http"
"os" "os"
@ -45,7 +44,6 @@ var (
) )
func main() { func main() {
rand.Seed(time.Now().UnixNano())
startConfig() startConfig()
@ -122,10 +120,6 @@ func socketHandler() {
} }
} }
func randInt(min int, max int) int {
return min + rand.Intn(max-min)
}
func fastStart() { func fastStart() {
defer func() { defer func() {
go updateFileRooms() go updateFileRooms()

View file

@ -8,6 +8,7 @@ import (
"net/url" "net/url"
"strings" "strings"
"time" "time"
"encoding/base64"
) )
var uptime = time.Now().Unix() var uptime = time.Now().Unix()
@ -93,33 +94,10 @@ func announceCount() {
} }
} }
func getAMF(room string) (bool, *AuthResponse) { func reconnectRoom(workerData Info) {
time.Sleep(5 * time.Second)
v := &AuthResponse{} fmt.Println("reconnect:", workerData.room, workerData.Proxy)
startRoom(workerData)
req, err := http.NewRequest(http.MethodPost, "https://rt.bongocams.com/tools/amf.php", strings.NewReader(`method=getRoomData&args[]=`+room))
if err != nil {
fmt.Println(err.Error())
return false, v
}
req.Header.Add("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8")
req.Header.Add("X-Requested-With", "XMLHttpRequest")
req.Header.Add("Accept", "application/json")
req.Header.Add("User-agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.101 Safari/537.36")
rsp, err := http.DefaultClient.Do(req)
if err != nil {
fmt.Println(err.Error())
return false, v
}
defer rsp.Body.Close()
if err = json.NewDecoder(rsp.Body).Decode(v); err != nil {
fmt.Println(err.Error())
return false, v
}
return true, v
} }
func xWorker(workerData Info, u url.URL) { func xWorker(workerData Info, u url.URL) {
@ -131,9 +109,23 @@ func xWorker(workerData Info, u url.URL) {
rooms.Del <- workerData.room rooms.Del <- workerData.room
}() }()
ok, v := getAMF(workerData.room) b64, err := base64.StdEncoding.DecodeString(workerData.Params)
if !ok { if err != nil {
fmt.Println("exit: no amf parms") fmt.Println(err, workerData.room)
return
}
v := struct {
Chathost string `json:"chathost"`
Username string `json:"username"`
DisplayName string `json:"displayName"`
Location string `json:"location"`
IsRu bool `json:"isRu"`
DataKey string `json:"dataKey"`
}{}
if err := json.Unmarshal(b64, &v); err != nil {
fmt.Println("exit: no amf parms", workerData.room, err)
return return
} }
@ -160,7 +152,7 @@ func xWorker(workerData Info, u url.URL) {
c.SetReadDeadline(time.Now().Add(60 * time.Second)) c.SetReadDeadline(time.Now().Add(60 * time.Second))
if err = c.WriteMessage(websocket.TextMessage, []byte(fmt.Sprintf(`{"id":%d,"name":"joinRoom","args":["%s",{"username":"%s","displayName":"%s","location":"%s","chathost":"%s","isRu":%t,"isPerformer":false,"hasStream":false,"isLogged":false,"isPayable":false,"showType":"public"},"%s"]}`, 1, v.UserData.Chathost, v.UserData.Username, v.UserData.DisplayName, v.UserData.Location, v.UserData.Chathost, v.UserData.IsRu, v.LocalData.DataKey))); err != nil { if err = c.WriteMessage(websocket.TextMessage, []byte(fmt.Sprintf(`{"id":%d,"name":"joinRoom","args":["%s",{"username":"%s","displayName":"%s","location":"%s","chathost":"%s","isRu":%t,"isPerformer":false,"hasStream":false,"isLogged":false,"isPayable":false,"showType":"public"},"%s"]}`, 1, v.Chathost, v.Username, v.DisplayName, v.Location, v.Chathost, v.IsRu, v.DataKey))); err != nil {
fmt.Println(err.Error()) fmt.Println(err.Error())
return return
} }
@ -218,9 +210,18 @@ func xWorker(workerData Info, u url.URL) {
}() }()
dons := make(map[string]struct{}) dons := make(map[string]struct{})
timeout := time.NewTicker(60 * 60 * 8 * time.Second)
defer timeout.Stop()
var income int64
income = 0
for { for {
select { select {
case <-timeout.C:
fmt.Println("too_long exit:", workerData.room)
return
case <-workerData.ch: case <-workerData.ch:
fmt.Println("Exit room:", workerData.room) fmt.Println("Exit room:", workerData.room)
return return
@ -230,24 +231,26 @@ func xWorker(workerData Info, u url.URL) {
c.SetReadDeadline(time.Now().Add(30 * time.Minute)) c.SetReadDeadline(time.Now().Add(30 * time.Minute))
_, message, err := c.ReadMessage() _, message, err := c.ReadMessage()
if err != nil { if err != nil {
fmt.Println(err.Error()) if income > 1 && websocket.IsUnexpectedCloseError(err, websocket.CloseGoingAway) {
go reconnectRoom(workerData)
}
return return
} }
now := time.Now().Unix() now := time.Now().Unix()
slog <- saveLog{workerData.Rid, now, string(message)} slog <- saveLog{workerData.Rid, now, string(message)}
if now > workerData.Last+60*60 {
fmt.Println("no_tips exit:", workerData.room)
return
}
m := &ServerResponse{} m := &ServerResponse{}
if err = json.Unmarshal(message, m); err != nil { if err = json.Unmarshal(message, m); err != nil {
fmt.Println(err.Error(), workerData.room) fmt.Println(err.Error(), workerData.room)
continue continue
} }
workerData.Last = now
rooms.Add <- workerData
if m.Type == "ServerMessageEvent:PERFORMER_STATUS_CHANGE" && string(m.Body) == `"offline"` { if m.Type == "ServerMessageEvent:PERFORMER_STATUS_CHANGE" && string(m.Body) == `"offline"` {
fmt.Println(m.Type, workerData.room) fmt.Println(m.Type, workerData.room)
return return
@ -261,7 +264,6 @@ func xWorker(workerData Info, u url.URL) {
if m.Type == "ServerMessageEvent:INCOMING_TIP" { if m.Type == "ServerMessageEvent:INCOMING_TIP" {
d := &DonateResponse{} d := &DonateResponse{}
if err = json.Unmarshal(m.Body, d); err == nil { if err = json.Unmarshal(m.Body, d); err == nil {
//fmt.Println(d.F.Username, "send", d.A, "tokens")
workerData.Tips++ workerData.Tips++
if _, ok := dons[d.F.Username]; !ok { if _, ok := dons[d.F.Username]; !ok {
@ -271,8 +273,13 @@ func xWorker(workerData Info, u url.URL) {
save <- saveData{workerData.room, strings.ToLower(d.F.Username), workerData.Rid, d.A, now} save <- saveData{workerData.room, strings.ToLower(d.F.Username), workerData.Rid, d.A, now}
income += d.A
workerData.Last = now
workerData.Income += d.A workerData.Income += d.A
rooms.Add <- workerData rooms.Add <- workerData
fmt.Println(d.F.Username, "send", d.A, "tokens to", workerData.room)
} }
} }
} }