This commit is contained in:
poiuty 2022-08-14 13:32:35 +03:00
parent e9ff078dc2
commit dad37ec59b
8 changed files with 217 additions and 257 deletions

View file

@ -3,7 +3,6 @@ package main
import (
"fmt"
"net/http"
"net/url"
"os"
"runtime"
"strings"
@ -114,5 +113,5 @@ func startRoom(workerData Info) {
workerData.Rid = rid
workerData.ch = make(chan struct{})
go xWorker(workerData, url.URL{Scheme: "wss", Host: workerData.Server + ".bcccdn.com", Path: "/websocket"})
go xWorker(workerData)
}

View file

@ -17,7 +17,7 @@ func startConfig() {
conf.Conn = map[string]string{
"mysql": "user:passwd@unix(/var/run/mysqld/mysqld.sock)/base?interpolateParams=true",
"click": "tcp://127.0.0.1:9000/base?compress=true&debug=false",
"start": "/tmp/bongaStart.txt",
"start": "/tmp/stripStart.txt",
}
// 3proxy

View file

@ -56,14 +56,14 @@ func main() {
go saveLogs()
go broadcast()
http.HandleFunc("/bongacams/ws/", wsHandler)
http.HandleFunc("/bongacams/cmd/", cmdHandler)
http.HandleFunc("/bongacams/list/", listHandler)
http.HandleFunc("/bongacams/debug/", debugHandler)
http.HandleFunc("/stripchat/ws/", wsHandler)
http.HandleFunc("/stripchat/cmd/", cmdHandler)
http.HandleFunc("/stripchat/list/", listHandler)
http.HandleFunc("/stripchat/debug/", debugHandler)
go fastStart()
const SOCK = "/tmp/bongacams.sock"
const SOCK = "/tmp/stripchat.sock"
os.Remove(SOCK)
unixListener, err := net.Listen("unix", SOCK)
if err != nil {
@ -127,6 +127,6 @@ func fastStart() {
Tips: v.Tips,
}
startRoom(workerData)
time.Sleep(2 * time.Second)
time.Sleep(5 * time.Second)
}
}

View file

@ -59,34 +59,23 @@ func getSumTokens() int64 {
func saveDB() {
hours, _, _ := time.Now().Clock()
bulk := make(map[int]saveData)
update := make(map[int64]int64)
bulk := []saveData{}
update := []struct {
Rid int64
Now int64
}{}
data := make(map[string]*DonatorCache)
index := make(map[string]int64)
ticker := time.NewTicker(10 * time.Second)
index = map[string]int64{"hours": int64(hours), "tokens": getSumTokens(), "last": time.Now().Unix()}
for {
select {
case m := <-save:
//fmt.Println("Save channel:", len(save), cap(save))
now := time.Now().Unix()
if _, ok := data[m.From]; ok {
data[m.From].Last = now
} else {
data[m.From] = &DonatorCache{Id: getDonId(m.From), Last: now}
}
num := len(bulk)
bulk[num] = m
update[m.Rid] = m.Now
if num > 512 {
case <-ticker.C:
if len(bulk) > 0 {
tx, err := Mysql.Begin()
if err == nil {
st, _ := tx.Prepare("INSERT INTO `stat` (`did`, `rid`, `token`, `time`) VALUES (?, ?, ?, ?)")
@ -100,8 +89,8 @@ func saveDB() {
tx, err = Mysql.Begin()
if err == nil {
st, _ := tx.Prepare("UPDATE `room` SET `last` = ? WHERE `id` = ?")
for k, v := range update {
st.Exec(v, k)
for _, v := range update {
st.Exec(v.Now, v.Rid)
}
tx.Commit()
st.Close()
@ -117,11 +106,30 @@ func saveDB() {
st.Close()
}
bulk = make(map[int]saveData)
update = make(map[int64]int64)
bulk = nil
update = nil
}
case m := <-save:
//fmt.Println("Save channel:", len(save), cap(save))
now := time.Now().Unix()
if _, ok := data[m.From]; ok {
data[m.From].Last = now
} else {
data[m.From] = &DonatorCache{Id: getDonId(m.From), Last: now}
}
if m.Amount > 99 {
bulk = append(bulk, m)
update = append(update, struct {
Rid int64
Now int64
}{
Rid: m.Rid,
Now: m.Now,
})
if m.Amount > 49 {
msg, err := json.Marshal(struct {
Room string `json:"room"`
Donator string `json:"donator"`
@ -146,8 +154,8 @@ func saveDB() {
if minutes >= 5 && now > index["last"]+30 {
seconds += minutes * 60
msg, err := json.Marshal(struct {
Index int64 `json:"index"`
}{Index: index["tokens"] / int64(seconds) * 3600 / 1000 * 5 / 100})
Index float64 `json:"index"`
}{Index: float64(index["tokens"]) / float64(seconds) * 3600 * 0.05 / 1000})
if err == nil {
ws.Send <- msg
}
@ -168,14 +176,12 @@ func saveDB() {
}
func saveLogs() {
bulk := make(map[int]saveLog)
bulk := []saveLog{}
ticker := time.NewTicker(10 * time.Second)
for {
select {
case m := <-slog:
if len(m.Mes) > 0 {
num := len(bulk)
bulk[num] = m
if num > 2048 {
case <-ticker.C:
if len(bulk) > 0 {
tx, err := Mysql.Begin()
if err == nil {
st, _ := tx.Prepare("INSERT INTO `logs` (`rid`, `time`, `mes`) VALUES (?, ?, ?)")
@ -185,8 +191,11 @@ func saveLogs() {
tx.Commit()
st.Close()
}
bulk = make(map[int]saveLog)
}
bulk = nil
}
case m := <-slog:
if len(m.Mes) > 0 {
bulk = append(bulk, m)
}
}
}

View file

@ -3,40 +3,68 @@ package main
import (
"fmt"
"github.com/gorilla/websocket"
jsoniter "github.com/json-iterator/go"
"net/http"
"net/url"
"strings"
"time"
"regexp"
"bytes"
"context"
"io/ioutil"
"strconv"
)
var uptime = time.Now().Unix()
type AuthResponse struct {
Status string `json:"status"`
LocalData struct {
DataKey string `json:"dataKey"`
} `json:"localData"`
UserData struct {
Username string `json:"username"`
DisplayName string `json:"displayName"`
Location string `json:"location"`
Chathost string `json:"chathost"`
IsRu bool `json:"isRu"`
} `json:"userData"`
type Amount struct {
value int64
}
func (a Amount) Value() int64 {
return a.value
}
func (a *Amount) UnmarshalJSON(b []byte) error {
str := string(b)
s := 0
e := len(b)
if len(str) > 2 && str[0] == '"' && str[len(b)-1] == '"' {
s = 1
e = len(b) - 1
}
var err error
a.value, err = strconv.ParseInt(str[s:e], 10, 64)
return err
}
type ServerResponse struct {
TS int64 `json:"ts"`
Type string `json:"type"`
Body jsoniter.RawMessage `json:"body"`
}
SubscriptionKey string `json:"subscriptionKey,omitempty"`
type DonateResponse struct {
F struct {
Username string `json:"username"`
} `json:"f"`
A int64 `json:"a"`
Params struct {
Model struct {
Status string `json:"status,omitempty"`
} `json:"model,omitempty"`
User struct {
Status string `json:"status,omitempty"`
} `json:"user,omitempty"`
ClientId string `json:"clientId,omitempty"`
Message struct {
Type string `json:"type,omitempty"`
Userdata struct {
Username string `json:"username,omitempty"`
} `json:"userdata,omitempty"`
Details struct {
Amount Amount `json:"amount,omitempty"`
LovenseDetails struct {
Type string `json:"type,omitempty"`
Detail struct {
Name string `json:"name,omitempty"`
Amount Amount `json:"amount,omitempty"`
} `json:"detail,omitempty"`
} `json:"lovenseDetails"`
} `json:"details,omitempty"`
} `json:"message,omitempty"`
} `json:"params,omitempty"`
}
func mapRooms() {
@ -89,37 +117,50 @@ func announceCount() {
}
}
func getAMF(room string) (bool, *AuthResponse) {
v := &AuthResponse{}
req, err := http.NewRequest(http.MethodPost, "https://rt.bongocams.com/tools/amf.php?res=771840&t=1654437233142", strings.NewReader(`method=getRoomData&args[]=`+room))
func getToken(room string) (*url.URL, string) {
req, err := http.NewRequestWithContext(context.TODO(), http.MethodGet, "https://ru.stripchat.com/"+room, nil)
if err != nil {
fmt.Println(err.Error())
return false, v
return &url.URL{}, "cantGetToken"
}
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("Referrer", "https://bongacams.com")
req.Header.Add("User-agent", "curl/7.79.1")
req.Header.Add("User-Agent", "Mozilla/5.0 (X11; Linux x86_64; rv:33.0) Gecko/20100101 Firefox/33.0")
req.Header.Add("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8")
req.Header.Add("Accept-Language", "en-US,en;q=0.5")
req.Header.Add("Connection", "keep-alive")
req.Header.Add("Referer", "https://ru.stripchat.com")
rsp, err := http.DefaultClient.Do(req)
if err != nil {
fmt.Println(err.Error())
return false, v
return &url.URL{}, "cantGetToken"
} else if rsp.StatusCode != http.StatusOK {
return &url.URL{}, "cantGetToken"
}
defer rsp.Body.Close()
if err = json.NewDecoder(rsp.Body).Decode(v); err != nil {
fmt.Println(err.Error())
return false, v
buf, err := ioutil.ReadAll(rsp.Body)
if err != nil {
return &url.URL{}, "cantGetToken"
}
re := regexp.MustCompile(`"websocketUrl":"*(.*?)\s*"`)
m := re.FindSubmatch(buf)
if len(m) != 2 {
return &url.URL{}, "cantGetToken"
}
r := bytes.ReplaceAll(m[1], []byte(`\u002F`), []byte(`/`))
u, err := url.Parse(string(r))
if err != nil {
return &url.URL{}, "cantGetToken"
}
return true, v
re = regexp.MustCompile(`img.strpst.com/thumbs/*(.*?)\s*"`)
id := re.FindSubmatch(buf)
if len(id) != 2 {
return &url.URL{}, "cantGetToken"
}
xid := string(id[1])
return u, xid[strings.Index(xid, "/")+1:]
}
func xWorker(workerData Info, u url.URL) {
func xWorker(workerData Info) {
fmt.Println("Start", workerData.room, "server", workerData.Server, "proxy", workerData.Proxy)
rooms.Add <- workerData
@ -128,14 +169,18 @@ func xWorker(workerData Info, u url.URL) {
rooms.Del <- workerData.room
}()
ok, v := getAMF(workerData.room)
if !ok {
fmt.Println("exit: no amf parms")
u, id := getToken(workerData.room)
if id == "cantGetToken" {
fmt.Println("cantGetToken", workerData.room)
return
}
Dialer := *websocket.DefaultDialer
proxyMap := make(map[string]string)
proxyMap["us"] = "5.161.128.20:3128"
proxyMap["fi"] = "65.21.180.188:3128"
if _, ok := conf.Proxy[workerData.Proxy]; ok {
Dialer = websocket.Dialer{
Proxy: http.ProxyURL(&url.URL{
@ -149,91 +194,25 @@ func xWorker(workerData Info, u url.URL) {
c, _, err := Dialer.Dial(u.String(), nil)
if err != nil {
fmt.Println(err.Error(), workerData.room)
fmt.Println(err.Error())
return
}
defer c.Close()
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 {
fmt.Println(err.Error())
return
}
_, message, err := c.ReadMessage()
if err != nil {
fmt.Println(err.Error(), workerData.room)
return
}
slog <- saveLog{workerData.Rid, time.Now().Unix(), string(message)}
if string(message) == `{"id":1,"result":{"audioAvailable":false,"freeShow":false},"error":null}` {
fmt.Println("room offline, exit", workerData.room)
return
}
if err = c.WriteMessage(websocket.TextMessage, []byte(fmt.Sprintf(`{"id":%d,"name":"ChatModule.connect","args":["public-chat"]}`, 2))); err != nil {
fmt.Println(err.Error(), workerData.room)
return
}
_, message, err = c.ReadMessage()
if err != nil {
fmt.Println(err.Error(), workerData.room)
return
}
slog <- saveLog{workerData.Rid, time.Now().Unix(), string(message)}
quit := make(chan struct{})
pid := 3
defer func() {
close(quit)
}()
go func() {
ticker := time.NewTicker(30 * time.Second)
defer ticker.Stop()
for {
select {
case <-quit:
return
case <-ticker.C:
if err = c.WriteMessage(websocket.TextMessage, []byte(fmt.Sprintf(`{"id":%d,"name":"ping"}`, pid))); err != nil {
fmt.Println(err.Error(), workerData.room)
rooms.Stop <- workerData.room
return
}
pid++
break
}
}
}()
dons := make(map[string]struct{})
for {
select {
case <-workerData.ch:
fmt.Println("Exit room:", workerData.room)
return
default:
}
c.SetReadDeadline(time.Now().Add(30 * time.Minute))
_, message, err := c.ReadMessage()
if err != nil {
fmt.Println(err.Error())
fmt.Println(err.Error(), workerData.room)
return
}
now := time.Now().Unix()
slog <- saveLog{workerData.Rid, now, string(message)}
slog <- saveLog{workerData.Rid, time.Now().Unix(), string(message)}
m := &ServerResponse{}
@ -245,32 +224,63 @@ func xWorker(workerData Info, u url.URL) {
workerData.Last = now
rooms.Add <- workerData
if m.Type == "ServerMessageEvent:PERFORMER_STATUS_CHANGE" && string(m.Body) == `"offline"` {
fmt.Println(m.Type, workerData.room)
if m.SubscriptionKey == "connected" {
messages := [][]byte{}
messages = append(messages, []byte(`{"id":"1660248194970-sub-lotteryChanged","method":"PUT","url":"/front/clients/`+m.Params.ClientId+`/subscriptions/lotteryChanged"}`))
messages = append(messages, []byte(`{"id":"1660248194970-sub-userBanned:`+id+`","method":"PUT","url":"/front/clients/`+m.Params.ClientId+`/subscriptions/userBanned:`+id+`"}`))
messages = append(messages, []byte(`{"id":"1660248194970-sub-goalChanged:`+id+`","method":"PUT","url":"/front/clients/`+m.Params.ClientId+`/subscriptions/goalChanged:`+id+`"}`))
messages = append(messages, []byte(`{"id":"1660248194970-sub-modelStatusChanged:`+id+`","method":"PUT","url":"/front/clients/`+m.Params.ClientId+`/subscriptions/modelStatusChanged:`+id+`"}`))
messages = append(messages, []byte(`{"id":"1660248194971-sub-broadcastSettingsChanged:`+id+`","method":"PUT","url":"/front/clients/`+m.Params.ClientId+`/subscriptions/broadcastSettingsChanged:`+id+`"}`))
messages = append(messages, []byte(`{"id":"1660248194971-sub-tipMenuUpdated:`+id+`","method":"PUT","url":"/front/clients/`+m.Params.ClientId+`/subscriptions/tipMenuUpdated:`+id+`"}`))
messages = append(messages, []byte(`{"id":"1660248194971-sub-topicChanged:`+id+`","method":"PUT","url":"/front/clients/`+m.Params.ClientId+`/subscriptions/topicChanged:`+id+`"}`))
messages = append(messages, []byte(`{"id":"1660248194971-sub-userUpdated:`+id+`","method":"PUT","url":"/front/clients/`+m.Params.ClientId+`/subscriptions/userUpdated:`+id+`"}`))
messages = append(messages, []byte(`{"id":"1660248194971-sub-interactiveToyStatusChanged:`+id+`","method":"PUT","url":"/front/clients/`+m.Params.ClientId+`/subscriptions/interactiveToyStatusChanged:`+id+`"}`))
messages = append(messages, []byte(`{"id":"1660248194971-sub-groupShow:`+id+`","method":"PUT","url":"/front/clients/`+m.Params.ClientId+`/subscriptions/groupShow:`+id+`"}`))
messages = append(messages, []byte(`{"id":"1660248194971-sub-deleteChatMessages:`+id+`","method":"PUT","url":"/front/clients/`+m.Params.ClientId+`/subscriptions/deleteChatMessages:`+id+`"}`))
messages = append(messages, []byte(`{"id":"1660248194971-sub-tipLeaderboardSettingsUpdated:`+id+`","method":"PUT","url":"/front/clients/`+m.Params.ClientId+`/subscriptions/tipLeaderboardSettingsUpdated:`+id+`"}`))
messages = append(messages, []byte(`{"id":"1660248194971-sub-modelAppUpdated:`+id+`","method":"PUT","url":"/front/clients/`+m.Params.ClientId+`/subscriptions/modelAppUpdated:`+id+`"}`))
messages = append(messages, []byte(`{"id":"1660248194972-sub-newKing:`+id+`","method":"PUT","url":"/front/clients/`+m.Params.ClientId+`/subscriptions/newKing:`+id+`"}`))
messages = append(messages, []byte(`{"id":"1660248194972-sub-privateMessageSettingsChanged:`+id+`","method":"PUT","url":"/front/clients/`+m.Params.ClientId+`/subscriptions/privateMessageSettingsChanged:`+id+`"}`))
messages = append(messages, []byte(`{"id":"1660248194972-sub-newChatMessage:`+id+`","method":"PUT","url":"/front/clients/`+m.Params.ClientId+`/subscriptions/newChatMessage:`+id+`"}`))
messages = append(messages, []byte(`{"id":"1660248194972-sub-fanClubUpdated:`+id+`","method":"PUT","url":"/front/clients/`+m.Params.ClientId+`/subscriptions/fanClubUpdated:`+id+`"}`))
messages = append(messages, []byte(`{"id":"1660248194972-sub-viewServerChanged:hls-07","method":"PUT","url":"/front/clients/`+m.Params.ClientId+`/subscriptions/viewServerChanged:hls-07"}`))
for _, msg := range messages {
if err = c.WriteMessage(websocket.TextMessage, msg); err != nil {
fmt.Println(err.Error(), workerData.room)
return
}
}
messages = nil
}
if strings.Contains(m.SubscriptionKey, "userUpdated") && m.Params.User.Status == "off" {
fmt.Println("user exiting", workerData.room)
return
}
if m.Type == "ServerMessageEvent:ROOM_CLOSE" {
fmt.Println(m.Type, workerData.room)
if strings.Contains(m.SubscriptionKey, "modelStatusChanged") && m.Params.Model.Status == "off" {
fmt.Println("user exiting", workerData.room)
return
}
if m.Type == "ServerMessageEvent:INCOMING_TIP" {
d := &DonateResponse{}
if err = json.Unmarshal(m.Body, d); err == nil {
//fmt.Println(d.F.Username, "send", d.A, "tokens")
if m.Params.Message.Type == "tip" {
if len(m.Params.Message.Userdata.Username) < 3 {
continue
}
fmt.Println(m.Params.Message.Userdata.Username, "send", m.Params.Message.Details.Amount.Value(), "tokens")
workerData.Tips++
if _, ok := dons[d.F.Username]; !ok {
dons[d.F.Username] = struct{}{}
if _, ok := dons[m.Params.Message.Userdata.Username]; !ok {
dons[m.Params.Message.Userdata.Username] = struct{}{}
workerData.Dons++
}
save <- saveData{workerData.room, d.F.Username, workerData.Rid, d.A, now}
save <- saveData{workerData.room, strings.ToLower(m.Params.Message.Userdata.Username), workerData.Rid, m.Params.Message.Details.Amount.Value(), now}
workerData.Income += d.A
workerData.Income += m.Params.Message.Details.Amount.Value()
rooms.Add <- workerData
}
}
}
}

17
go.mod
View file

@ -1,17 +0,0 @@
module stripchat
go 1.19
require (
github.com/ClickHouse/clickhouse-go v1.5.4
github.com/go-sql-driver/mysql v1.6.0
github.com/gorilla/websocket v1.5.0
github.com/jmoiron/sqlx v1.3.5
github.com/json-iterator/go v1.1.12
)
require (
github.com/cloudflare/golz4 v0.0.0-20150217214814-ef862a3cdc58 // indirect
github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421 // indirect
github.com/modern-go/reflect2 v1.0.2 // indirect
)

37
go.sum
View file

@ -1,37 +0,0 @@
github.com/ClickHouse/clickhouse-go v1.5.4 h1:cKjXeYLNWVJIx2J1K6H2CqyRmfwVJVY1OV1coaaFcI0=
github.com/ClickHouse/clickhouse-go v1.5.4/go.mod h1:EaI/sW7Azgz9UATzd5ZdZHRUhHgv5+JMS9NSr2smCJI=
github.com/bkaradzic/go-lz4 v1.0.0 h1:RXc4wYsyz985CkXXeX04y4VnZFGG8Rd43pRaHsOXAKk=
github.com/bkaradzic/go-lz4 v1.0.0/go.mod h1:0YdlkowM3VswSROI7qDxhRvJ3sLhlFrRRwjwegp5jy4=
github.com/cloudflare/golz4 v0.0.0-20150217214814-ef862a3cdc58 h1:F1EaeKL/ta07PY/k9Os/UFtwERei2/XzGemhpGnBKNg=
github.com/cloudflare/golz4 v0.0.0-20150217214814-ef862a3cdc58/go.mod h1:EOBUe0h4xcZ5GoxqC5SDxFQ8gwyZPKQoEzownBlhI80=
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/go-sql-driver/mysql v1.4.0/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w=
github.com/go-sql-driver/mysql v1.6.0 h1:BCTh4TKNUYmOmMUcQ3IipzF5prigylS7XXjEkfCHuOE=
github.com/go-sql-driver/mysql v1.6.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg=
github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc=
github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=
github.com/jmoiron/sqlx v1.2.0/go.mod h1:1FEQNm3xlJgrMD+FBdI9+xvCksHtbpVBBw5dYhBSsks=
github.com/jmoiron/sqlx v1.3.5 h1:vFFPA71p1o5gAeqtEAwLU4dnX2napprKtHr7PYIcN3g=
github.com/jmoiron/sqlx v1.3.5/go.mod h1:nRVWtLre0KfCLJvgxzCsLVMogSvQ1zNJtpYr2Ccp0mQ=
github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM=
github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=
github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo=
github.com/lib/pq v1.2.0 h1:LXpIM/LZ5xGFhOpXAQUIMM1HdyqzVYM13zNdjCEEcA0=
github.com/lib/pq v1.2.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo=
github.com/mattn/go-sqlite3 v1.9.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc=
github.com/mattn/go-sqlite3 v1.14.6 h1:dNPt6NO46WmLVt2DLNpwczCmdV5boIZ6g/tlDrlRUbg=
github.com/mattn/go-sqlite3 v1.14.6/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU=
github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421 h1:ZqeYNhU3OHLH3mGKHDcjJRFFRrJa6eAM5H+CtDdOsPc=
github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M=
github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk=
github.com/pierrec/lz4 v2.0.5+incompatible h1:2xWsjqPFWcplujydGg4WmhC/6fZqK42wMM8aXeqhl0I=
github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY=
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
github.com/stretchr/testify v1.3.0 h1:TivCn/peBQ7UY8ooIcPgZFpTNSz0Q2U6UrFlUfqbe0Q=
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=

View file

@ -147,10 +147,6 @@ func startRoom(room, server, proxy string, u *url.URL, id string) {
return
}
if !strings.Contains(m.SubscriptionKey, "newChatMessage") {
continue
}
if m.Params.Message.Type == "tip" {
fmt.Println(m.Params.Message.Userdata.Username, " send ", m.Params.Message.Details.Amount.Value(), "tokens")
}