2022-07-27 11:28:07 +03:00
|
|
|
package main
|
|
|
|
|
|
|
|
|
|
import (
|
2022-08-07 14:18:21 +03:00
|
|
|
"fmt"
|
2022-07-27 11:28:07 +03:00
|
|
|
"log"
|
|
|
|
|
"math/rand"
|
|
|
|
|
"net"
|
|
|
|
|
"net/http"
|
|
|
|
|
"os"
|
|
|
|
|
"time"
|
|
|
|
|
|
|
|
|
|
_ "github.com/ClickHouse/clickhouse-go"
|
|
|
|
|
_ "github.com/go-sql-driver/mysql"
|
|
|
|
|
"github.com/jmoiron/sqlx"
|
|
|
|
|
jsoniter "github.com/json-iterator/go"
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
type Rooms struct {
|
|
|
|
|
Count chan int
|
|
|
|
|
Json chan string
|
2022-08-07 14:18:21 +03:00
|
|
|
Check chan string
|
|
|
|
|
Stop chan string
|
2022-07-27 11:28:07 +03:00
|
|
|
Del chan string
|
2022-08-07 14:18:21 +03:00
|
|
|
Add chan Info
|
2022-07-27 11:28:07 +03:00
|
|
|
}
|
|
|
|
|
|
2022-08-07 14:18:21 +03:00
|
|
|
var (
|
|
|
|
|
Mysql, Clickhouse *sqlx.DB
|
2022-07-27 11:28:07 +03:00
|
|
|
|
2022-08-07 14:18:21 +03:00
|
|
|
json = jsoniter.ConfigCompatibleWithStandardLibrary
|
2023-05-11 14:40:18 +03:00
|
|
|
|
|
|
|
|
socketServer = make(chan []byte, 100)
|
2022-07-27 11:28:07 +03:00
|
|
|
|
2022-08-07 14:18:21 +03:00
|
|
|
save = make(chan saveData, 100)
|
|
|
|
|
slog = make(chan saveLog, 100)
|
|
|
|
|
|
|
|
|
|
rooms = &Rooms{
|
|
|
|
|
Count: make(chan int),
|
|
|
|
|
Json: make(chan string),
|
|
|
|
|
Check: make(chan string),
|
|
|
|
|
Stop: make(chan string),
|
|
|
|
|
Del: make(chan string),
|
|
|
|
|
Add: make(chan Info),
|
|
|
|
|
}
|
|
|
|
|
)
|
2022-07-27 11:28:07 +03:00
|
|
|
|
|
|
|
|
func main() {
|
|
|
|
|
rand.Seed(time.Now().UnixNano())
|
|
|
|
|
|
|
|
|
|
startConfig()
|
|
|
|
|
|
|
|
|
|
initMysql()
|
|
|
|
|
initClickhouse()
|
|
|
|
|
|
|
|
|
|
go mapRooms()
|
|
|
|
|
go announceCount()
|
|
|
|
|
go saveDB()
|
|
|
|
|
go saveLogs()
|
2023-05-11 14:40:18 +03:00
|
|
|
go socketHandler()
|
2022-07-27 11:28:07 +03:00
|
|
|
|
|
|
|
|
http.HandleFunc("/bongacams/cmd/", cmdHandler)
|
|
|
|
|
http.HandleFunc("/bongacams/list/", listHandler)
|
|
|
|
|
http.HandleFunc("/bongacams/debug/", debugHandler)
|
|
|
|
|
|
2022-08-07 14:18:21 +03:00
|
|
|
go fastStart()
|
|
|
|
|
|
2022-07-27 11:28:07 +03:00
|
|
|
const SOCK = "/tmp/bongacams.sock"
|
|
|
|
|
os.Remove(SOCK)
|
|
|
|
|
unixListener, err := net.Listen("unix", SOCK)
|
|
|
|
|
if err != nil {
|
|
|
|
|
log.Fatal("Listen (UNIX socket): ", err)
|
|
|
|
|
}
|
|
|
|
|
defer unixListener.Close()
|
|
|
|
|
os.Chmod(SOCK, 0777)
|
|
|
|
|
log.Fatal(http.Serve(unixListener, nil))
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func initMysql() {
|
|
|
|
|
db, err := sqlx.Connect("mysql", conf.Conn["mysql"])
|
|
|
|
|
if err != nil {
|
|
|
|
|
panic(err)
|
|
|
|
|
}
|
|
|
|
|
Mysql = db
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func initClickhouse() {
|
|
|
|
|
db, err := sqlx.Connect("clickhouse", conf.Conn["click"])
|
|
|
|
|
if err != nil {
|
|
|
|
|
panic(err)
|
|
|
|
|
}
|
|
|
|
|
Clickhouse = db
|
|
|
|
|
}
|
|
|
|
|
|
2023-05-11 14:40:18 +03:00
|
|
|
func socketHandler() {
|
|
|
|
|
for {
|
|
|
|
|
select {
|
|
|
|
|
case b := <-socketServer:
|
|
|
|
|
conn, err := net.Dial("unix", "/tmp/echo.sock")
|
|
|
|
|
if err == nil {
|
|
|
|
|
conn.Write(b)
|
|
|
|
|
conn.Close()
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2022-07-27 11:28:07 +03:00
|
|
|
func randInt(min int, max int) int {
|
|
|
|
|
return min + rand.Intn(max-min)
|
|
|
|
|
}
|
2022-08-07 14:18:21 +03:00
|
|
|
|
|
|
|
|
func fastStart() {
|
|
|
|
|
defer func() {
|
|
|
|
|
go updateFileRooms()
|
|
|
|
|
}()
|
|
|
|
|
dat, err := os.ReadFile(conf.Conn["start"])
|
|
|
|
|
if err != nil {
|
|
|
|
|
fmt.Println(err)
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
list := make(map[string]Info)
|
|
|
|
|
if err := json.Unmarshal(dat, &list); err != nil {
|
|
|
|
|
fmt.Println(err.Error())
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
now := time.Now().Unix()
|
|
|
|
|
for k, v := range list {
|
|
|
|
|
if now > v.Last+60*20 {
|
|
|
|
|
continue
|
|
|
|
|
}
|
|
|
|
|
fmt.Println("fastStart:", k, v.Server, v.Proxy)
|
|
|
|
|
workerData := Info{
|
|
|
|
|
room: k,
|
|
|
|
|
Server: v.Server,
|
|
|
|
|
Proxy: v.Proxy,
|
|
|
|
|
Online: v.Online,
|
|
|
|
|
Start: v.Start,
|
|
|
|
|
Last: now,
|
|
|
|
|
Rid: v.Rid,
|
|
|
|
|
Income: v.Income,
|
|
|
|
|
Dons: v.Dons,
|
|
|
|
|
Tips: v.Tips,
|
|
|
|
|
}
|
|
|
|
|
startRoom(workerData)
|
|
|
|
|
time.Sleep(2 * time.Second)
|
|
|
|
|
}
|
|
|
|
|
}
|