123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081 |
- package chat
- import (
- "context"
- "log"
- "sync"
- "sync/atomic"
- "git.ali33.ru/fcg-xvii/rest"
- )
- func New() *Chat {
- res := &Chat{
- users: &sync.Map{},
- idCounter: &atomic.Int64{},
- chConnect: make(chan rest.IStream, 5),
- }
- go res.work()
- return res
- }
- type Chat struct {
- ctx context.Context
- cancel context.CancelFunc
- users *sync.Map
- idCounter *atomic.Int64
- chConnect chan rest.IStream
- }
- func (s *Chat) Close() {
- s.cancel()
- }
- func (s *Chat) work() {
- s.ctx, s.cancel = context.WithCancel(context.Background())
- for {
- select {
- case <-s.ctx.Done():
- return
- case stream := <-s.chConnect:
- log.Println("CONNECT-------")
- go func() {
- <-stream.Context().Done()
- log.Println("DISCONNECT-------")
- }()
- }
- }
- }
- func (s *Chat) Connect() chan<- rest.IStream {
- return s.chConnect
- }
- func (s *Chat) Register(name, password string) *User {
- user := &User{
- ID: s.idCounter.Add(1),
- Name: name,
- Password: password,
- }
- s.users.Store(user.ID, user)
- return user
- }
- func (s *Chat) SearchByID(id int64) (*User, bool) {
- if u, check := s.users.Load(id); check {
- return u.(*User), true
- }
- return nil, false
- }
- func (s *Chat) Auth(name, password string) (res *User, check bool) {
- s.users.Range(func(key, val any) bool {
- u := val.(*User)
- if u.Name == name && u.Password == password {
- res, check = u, true
- return false
- }
- return true
- })
- return
- }
|