Signed-off-by: Vasiliy Tolstov <v.tolstov@unistack.org>
This commit is contained in:
Vasiliy Tolstov 2023-01-25 01:42:19 +03:00
parent 8439348176
commit d9e6c4edbc

View file

@ -11,49 +11,105 @@ import (
)
func main() {
ctx := context.Background()
if len(os.Args) < 3 {
fmt.Println("./test room_uid authToken")
return
}
room_uid := os.Args[1]
authToken := os.Args[2]
ctx, cancel := context.WithCancel(context.Background())
defer cancel()
c, err := ably.NewRealtime(
ably.WithAutoConnect(true),
ably.WithToken(os.Args[1]),
ably.WithToken(authToken),
// ably.WithLogLevel(ably.LogDebug),
ably.WithAuthMethod(http.MethodGet),
ably.WithUseTokenAuth(true),
ably.WithRealtimeHost("realtime.pa.highwebmedia.com"),
)
if err != nil {
panic(err)
fmt.Println(err.Error())
return
}
rc := c.Channels.Get("room:tip_alert:" + os.Args[2])
if err := rc.Attach(ctx); err != nil {
panic(err)
}
defer func() {
if err := rc.Detach(ctx); err != nil {
panic(err)
}
}()
type donateMsg struct {
Name string `json:"to_username"`
From string `json:"from_username"`
Amount int64 `json:"amount"`
}
cancel, err := rc.SubscribeAll(ctx, func(msg *ably.Message) {
donate := &donateMsg{}
if err := json.Unmarshal([]byte(msg.Data.(string)), donate); err != nil {
type leaveMsg struct {
Action string `json:"action"`
IsBroadcaster bool `json:"is_broadcaster"`
}
tipChannel := "room:tip_alert:" + room_uid
leaveChannel := "room:enter_leave:" + room_uid
handler := func(msg *ably.Message) {
switch msg.Name {
case leaveChannel:
leave := &leaveMsg{}
if err := json.Unmarshal([]byte(msg.Data.(string)), leave); err != nil {
fmt.Println(err.Error())
cancel()
return
}
if leave.Action == "leave" && leave.IsBroadcaster {
fmt.Println("user finished and exit")
cancel()
return
}
case tipChannel:
donate := &donateMsg{}
if err := json.Unmarshal([]byte(msg.Data.(string)), donate); err != nil {
fmt.Println(err.Error())
cancel()
return
}
if donate.From == "" {
donate.From = "anonymous"
}
fmt.Println(donate.From, "send ", donate.Amount, "tokens")
}
}
for _, channel := range []string{tipChannel, leaveChannel} {
rc := c.Channels.Get(channel)
defer func() {
if err := c.Channels.Release(ctx, channel); err != nil {
fmt.Println(err.Error())
cancel()
}
}()
if err := rc.Attach(ctx); err != nil {
fmt.Println(err.Error())
return
}
if len(donate.From) > 3 {
fmt.Println(donate.From, "send ", donate.Amount, "tokens")
/* not needed as used Release before
defer func() {
if err := rc.Detach(ctx); err != nil {
fmt.Println(err.Error())
}
}()
*/
rccancel, err := rc.SubscribeAll(ctx, handler)
if err != nil {
fmt.Println(err.Error())
cancel()
}
})
if err != nil {
panic(err)
defer rccancel()
ecancel := rc.On(ably.ChannelEventDetached, func(state ably.ChannelStateChange) {
fmt.Printf("received detached")
cancel()
})
defer ecancel()
}
defer cancel()
defer c.Close()
select {}
<-ctx.Done()
}