github.com/glide-im/glide@v1.6.0/internal/world_channel/world_channel.go (about)

     1  package world_channel
     2  
     3  import (
     4  	"encoding/json"
     5  	"fmt"
     6  	messages2 "github.com/glide-im/glide/im_service/messages"
     7  	"github.com/glide-im/glide/pkg/gate"
     8  	"github.com/glide-im/glide/pkg/logger"
     9  	"github.com/glide-im/glide/pkg/messages"
    10  	"github.com/glide-im/glide/pkg/subscription"
    11  	"github.com/glide-im/glide/pkg/subscription/subscription_impl"
    12  	"time"
    13  )
    14  
    15  var sub subscription_impl.SubscribeWrap
    16  var chanId = subscription.ChanID("the_world_channel")
    17  
    18  func EnableWorldChannel(subscribe subscription_impl.SubscribeWrap) error {
    19  	sub = subscribe
    20  	err := sub.CreateChannel(chanId, &subscription.ChanInfo{
    21  		ID: chanId,
    22  	})
    23  	if err != nil {
    24  		return err
    25  	}
    26  	err = sub.Subscribe(chanId, "system", &subscription_impl.SubscriberOptions{Perm: subscription_impl.PermWrite})
    27  	return err
    28  }
    29  
    30  func OnUserOnline(id gate.ID) {
    31  	if id.IsTemp() {
    32  		return
    33  	}
    34  	myId := subscription.SubscriberID(gate.NewID2(id.UID()))
    35  	err := sub.Subscribe(chanId, myId,
    36  		&subscription_impl.SubscriberOptions{Perm: subscription_impl.PermRead | subscription_impl.PermWrite})
    37  	if err == nil {
    38  
    39  		time.Sleep(time.Second)
    40  		b := &messages.ChatMessage{
    41  			Mid:     time.Now().UnixNano(),
    42  			Seq:     0,
    43  			From:    "system",
    44  			To:      string(chanId),
    45  			Type:    100,
    46  			Content: id.UID(),
    47  			SendAt:  time.Now().Unix(),
    48  		}
    49  		_ = sub.Publish(chanId, &subscription_impl.PublishMessage{
    50  			From:    "system",
    51  			Type:    subscription_impl.TypeMessage,
    52  			Message: messages.NewMessage(0, messages2.ActionGroupMessage, b),
    53  		})
    54  
    55  		time.Sleep(time.Millisecond * 100)
    56  		b.Mid = time.Now().UnixNano()
    57  		b.SendAt = time.Now().Unix()
    58  		b.Type = 1
    59  		b.Content = fmt.Sprintf("欢迎来到世界频道, 在这个频道, 你可以与服务器所有用户聊天, 你的 UID 为: %s", id.UID())
    60  		_ = sub.Publish(chanId, &subscription_impl.PublishMessage{
    61  			From:    "system",
    62  			Type:    subscription_impl.TypeMessage,
    63  			To:      []subscription.SubscriberID{myId},
    64  			Message: messages.NewMessage(0, messages2.ActionGroupMessage, b),
    65  		})
    66  	} else {
    67  		logger.E("$v", err)
    68  	}
    69  }
    70  
    71  func OnUserOffline(id gate.ID) {
    72  	if id.IsTemp() {
    73  		return
    74  	}
    75  	_ = sub.UnSubscribe(chanId, subscription.SubscriberID(gate.NewID2(id.UID())))
    76  	b, _ := json.Marshal(&messages.ChatMessage{
    77  		Mid:     time.Now().UnixNano(),
    78  		Seq:     0,
    79  		From:    "system",
    80  		To:      string(chanId),
    81  		Type:    101,
    82  		Content: id.UID(),
    83  		SendAt:  time.Now().Unix(),
    84  	})
    85  	_ = sub.Publish(chanId, &subscription_impl.PublishMessage{
    86  		From:    "system",
    87  		Type:    subscription_impl.TypeMessage,
    88  		Message: messages.NewMessage(0, messages2.ActionGroupMessage, b),
    89  	})
    90  }