This commit is contained in:
poiuty 2023-06-08 16:35:42 +03:00
parent a455784f47
commit 06f4b6c002
3 changed files with 45 additions and 54 deletions

View file

@ -71,12 +71,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["id"]) > 0 && len(params["proxy"]) > 0 { if len(params["room"]) > 0 && len(params["id"]) > 0 && len(params["proxy"]) > 0 && len(params["ws"]) > 0 {
now := time.Now().Unix() now := time.Now().Unix()
workerData := Info{ workerData := Info{
room: params["room"][0], room: params["room"][0],
Id: params["id"][0], Id: params["id"][0],
Server: "", Server: params["ws"][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,8 +44,6 @@ var (
) )
func main() { func main() {
rand.Seed(time.Now().UnixNano())
startConfig() startConfig()
initMysql() initMysql()
@ -122,10 +119,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()
@ -160,6 +153,6 @@ func fastStart() {
Tips: v.Tips, Tips: v.Tips,
} }
startRoom(workerData) startRoom(workerData)
time.Sleep(5 * time.Second) time.Sleep(100 * time.Millisecond)
} }
} }

View file

@ -1,16 +1,14 @@
package main package main
import ( import (
"bytes"
"fmt" "fmt"
"github.com/gorilla/websocket" "github.com/gorilla/websocket"
"net/http" "net/http"
"net/url" "net/url"
"os/exec"
"regexp"
"strconv" "strconv"
"strings" "strings"
"time" "time"
"encoding/base64"
) )
var uptime = time.Now().Unix() var uptime = time.Now().Unix()
@ -120,32 +118,9 @@ func announceCount() {
} }
} }
func getToken(room string) string {
cmd := exec.Command("/home/stat/python/test.py", "https://stripchat.com/api/front/v2/config/data?requestPath="+room)
stdout, err := cmd.Output()
if err != nil {
fmt.Println(err.Error())
return "cant exec py"
}
//fmt.Println(string(stdout))
re := regexp.MustCompile(`"websocketUrl":"*(.*?)\s*"`)
m := re.FindSubmatch(stdout)
if len(m) != 2 {
return "cant get ws"
}
return string(bytes.ReplaceAll(m[1], []byte(`\u002F`), []byte(`/`)))
}
func reconnectRoom(workerData Info) { func reconnectRoom(workerData Info) {
n := randInt(10, 30) time.Sleep(5 * time.Second)
fmt.Printf("Sleeping %d seconds...\n", n)
time.Sleep(time.Duration(n) * time.Second)
fmt.Println("reconnect:", workerData.room, workerData.Id, workerData.Proxy) fmt.Println("reconnect:", workerData.room, workerData.Id, workerData.Proxy)
workerData.Last = time.Now().Unix()
startRoom(workerData) startRoom(workerData)
} }
@ -158,16 +133,19 @@ func xWorker(workerData Info) {
rooms.Del <- workerData.room rooms.Del <- workerData.room
}() }()
if workerData.Server == "" {
workerData.Server = getToken(workerData.room)
}
if len(workerData.Server) < 50 { if len(workerData.Server) < 50 {
fmt.Println(workerData.Server, workerData.room) fmt.Println(workerData.Server, workerData.room)
return return
} }
wsUrl, err := base64.StdEncoding.DecodeString(workerData.Server)
if err != nil {
fmt.Println(err, workerData.room)
return
}
u, err := url.Parse(workerData.Server) u, err := url.Parse(string(wsUrl))
if err != nil { if err != nil {
fmt.Println(err, workerData.room) fmt.Println(err, workerData.room)
return return
@ -195,32 +173,49 @@ func xWorker(workerData Info) {
defer c.Close() defer c.Close()
dons := make(map[string]struct{}) dons := make(map[string]struct{})
ticker := time.NewTicker(60 * 60 * 8 * time.Second)
defer ticker.Stop()
var income int64
income = 0
for { for {
select {
case <-ticker.C:
fmt.Println("too_long exit:", workerData.room)
return
case <-workerData.ch:
fmt.Println("Exit room:", workerData.room)
return
default:
}
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(), workerData.room) fmt.Println(err.Error(), workerData.room)
if workerData.Income > 1 && websocket.IsUnexpectedCloseError(err, websocket.CloseGoingAway) { if income > 1 && websocket.IsUnexpectedCloseError(err, websocket.CloseGoingAway) {
go reconnectRoom(workerData) go reconnectRoom(workerData)
} }
return return
} }
now := time.Now().Unix() now := time.Now().Unix()
slog <- saveLog{workerData.Rid, now, string(message)}
slog <- saveLog{workerData.Rid, time.Now().Unix(), 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.SubscriptionKey == "connected" { if m.SubscriptionKey == "connected" {
id := workerData.Id id := workerData.Id
messages := [][]byte{} messages := [][]byte{}
@ -250,6 +245,7 @@ func xWorker(workerData Info) {
} }
} }
messages = nil messages = nil
continue
} }
if strings.Contains(m.SubscriptionKey, "userUpdated") && m.Params.User.Status == "off" { if strings.Contains(m.SubscriptionKey, "userUpdated") && m.Params.User.Status == "off" {
@ -263,23 +259,25 @@ func xWorker(workerData Info) {
} }
if m.Params.Message.Type == "tip" { if m.Params.Message.Type == "tip" {
if len(m.Params.Message.Userdata.Username) < 3 { if len(m.Params.Message.Userdata.Username) < 3 {
m.Params.Message.Userdata.Username = "anon_tips" m.Params.Message.Userdata.Username = "anon_tips"
} }
fmt.Println(m.Params.Message.Userdata.Username, "send", m.Params.Message.Details.Amount.Value(), "tokens")
workerData.Tips++
if _, ok := dons[m.Params.Message.Userdata.Username]; !ok { if _, ok := dons[m.Params.Message.Userdata.Username]; !ok {
dons[m.Params.Message.Userdata.Username] = struct{}{} dons[m.Params.Message.Userdata.Username] = struct{}{}
workerData.Dons++ workerData.Dons++
} }
save <- saveData{workerData.room, strings.ToLower(m.Params.Message.Userdata.Username), workerData.Rid, m.Params.Message.Details.Amount.Value(), now} save <- saveData{workerData.room, strings.ToLower(m.Params.Message.Userdata.Username), workerData.Rid, m.Params.Message.Details.Amount.Value(), now}
income += m.Params.Message.Details.Amount.Value()
workerData.Tips++
workerData.Last = now
workerData.Income += m.Params.Message.Details.Amount.Value() workerData.Income += m.Params.Message.Details.Amount.Value()
rooms.Add <- workerData rooms.Add <- workerData
fmt.Println(m.Params.Message.Userdata.Username, "send", m.Params.Message.Details.Amount.Value(), "tokens to", workerData.room)
} }
} }
} }