@ -2,6 +2,7 @@ package kicker
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				import  ( 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
					"context" 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
					"errors" 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
					"fmt" 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
					"kickerbot/captchagen" 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
					"kickerbot/db" 
 
			
		 
		
	
	
		
			
				
					
					
						
					 
				
			
			 
			 
			
				@ -11,10 +12,40 @@ import (
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
					"git.nefrace.ru/nefrace/tongo" 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
					"github.com/NicoNex/echotron/v3" 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
					"go.mongodb.org/mongo-driver/mongo" 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				) 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				func  userJoined ( b  * bot ,  update  * echotron . Update )  error  { 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
					captcha  :=  captchagen . GenCaptcha (  ) 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
					ctx ,  cancel  :=  context . WithTimeout ( context . Background ( ) ,  15 * time . Second  ) 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
					defer  cancel ( ) 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
					store  :=  tongo . NewStore [ db . User ] ( Client ) 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
					usr  :=  update . Message . NewChatMembers [ 0 ] 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
					message  :=  update . Message 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
					user ,  err  :=  store . GetOne ( ctx ,  tongo . E ( "chat_id" ,  update . ChatID ( ) ) ,  tongo . E ( "user_id" ,  usr . ID ) ) 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
					var  captcha  * captchagen . Captcha 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
					if  err  !=  nil  { 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
						if  errors . Is ( err ,  mongo . ErrNoDocuments )  { 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
							captcha  =  captchagen . GenCaptcha ( ) 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
							user  =  & db . User { 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
								Item :              tongo . NewID ( ) , 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
								UserId :            usr . ID , 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
								Username :          usr . Username , 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
								FirstName :         usr . FirstName , 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
								LastName :          usr . LastName , 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
								IsJoined :          false , 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
								ChatId :            message . Chat . ID , 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
								JoinedMessage :     message . ID , 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
								CorrectAnswer :     int8 ( captcha . CorrectAnswer ) , 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
								DateJoined :        time . Now ( ) , 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
								LastNotification :  time . Now ( ) , 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
							} 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
						}  else  { 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
							log . Printf ( "Can't find user: %v" ,  err ) 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
						} 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
					} 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
					if  captcha  ==  nil  { 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
						return  nil 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
					} 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
					// _, err := b.DeleteMessage(update.Message.Chat.ID, update.Message.ID) 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
					// if err != nil { 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
					// 	log.Printf("Can't delete message: %v", err) 
 
			
		 
		
	
	
		
			
				
					
					
						
					 
				
			
			 
			 
			
				@ -22,27 +53,10 @@ func userJoined(b *bot, update *echotron.Update) error {
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
					bytes ,  err  :=  captcha . ToBytes ( ) 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
					if  err  !=  nil  { 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
						log . Printf ( "Error creating captcha bytes: %v" ,  bytes ) 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
						b . SendMessage ( "Н е   могу создать капчу, @nefrace, проверь логи." ,  update . Message . From . ID ,  & echotron . MessageOptions { MessageThreadID :  int64 ( update . Message . ThreadID ) } ) 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
					} 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
					message  :=  update . Message 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
					store  :=  tongo . NewStore [ db . User ] ( Client ) 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
					user  :=  db . User { 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
						Item :              tongo . NewID ( ) , 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
						UserId :            message . From . ID , 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
						Username :          message . From . Username , 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
						FirstName :         message . From . FirstName , 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
						LastName :          message . From . LastName , 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
						IsBanned :          false , 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
						IsJoined :          false , 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
						ChatId :            message . Chat . ID , 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
						JoinedMessage :     message . ID , 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
						CorrectAnswer :     int8 ( captcha . CorrectAnswer ) , 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
						DateJoined :        time . Now ( ) , 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
						LastNotification :  time . Now ( ) , 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
						b . SendMessage ( "Н е   могу создать капчу, @nefrace, проверь логи." ,  update . Message . Chat . ID ,  & echotron . MessageOptions { MessageThreadID :  int64 ( update . Message . ThreadID ) } ) 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
					} 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
					// user.CorrectAnswer = int8(captcha.CorrectAnswer) 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
					ctx ,  cancel  :=  context . WithTimeout ( context . Background ( ) ,  15 * time . Second ) 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
					defer  cancel ( ) 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
					log . Print ( user ) 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
					msg  :=  fmt . Sprintf ( "Приветствую тебя, *[%s](tg://user?id=%d)*\\!\nДля подтверждения, что ты человек, выбери логотип движка, которому посвящен данный чат, и отправь е г о   номер сюда\\.\n*_Я дам тебе десять минут на это\\._*" ,  EscapeText ( echotron . MarkdownV2 ,  user . FirstName ) ,  user . UserId ) 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
					options  :=  echotron . PhotoOptions { 
 
			
		 
		
	
	
		
			
				
					
					
						
					 
				
			
			 
			 
			
				@ -57,7 +71,7 @@ func userJoined(b *bot, update *echotron.Update) error {
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
						return  err 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
					} 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
					user . CaptchaMessage  =  result . Result . ID 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
					store . InsertOne ( ctx ,  & user ) 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
					store . InsertOne ( ctx ,  user ) 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
					return  nil 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				} 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				
 
			
		 
		
	
	
		
			
				
					
					
						
					 
				
			
			 
			 
			
				@ -67,7 +81,7 @@ func userLeft(b *bot, update *echotron.Update) error {
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
					store  :=  tongo . NewStore [ db . User ] ( Client ) 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
					ctx ,  cancel  :=  context . WithTimeout ( context . Background ( ) ,  15 * time . Second ) 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
					defer  cancel ( ) 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
					if  user ,  err  :=  store . GetOne ( ctx ,  tongo . E ( "user_id" ,  sender . ID ) ,  tongo . E ( "chat_id" ,  message . Chat . ID ) ,  tongo . E ( "is_joined" ,  false ) ,  tongo . E ( "is_banned" ,  false )  );  err  ==  nil  {  //d.GetUser(ctx, db.User{UserId: sender.ID, ChatId: message.Chat.ID}); err == nil { 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
					if  user ,  err  :=  store . GetOne ( ctx ,  tongo . E ( "user_id" ,  sender . ID ) ,  tongo . E ( "chat_id" ,  message . Chat . ID ) ,  tongo . E ( "is_joined" ,  false ) ) ;  err  ==  nil  {  //d.GetUser(ctx, db.User{UserId: sender.ID, ChatId: message.Chat.ID}); err == nil { 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
						store . DeleteByID ( ctx ,  user . Id ) 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
						b . DeleteMessage ( message . Chat . ID ,  message . ID ) 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
						b . DeleteMessage ( message . Chat . ID ,  user . CaptchaMessage ) 
 
			
		 
		
	
	
		
			
				
					
					
						
					 
				
			
			 
			 
			
				@ -75,6 +89,19 @@ func userLeft(b *bot, update *echotron.Update) error {
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
					return  nil 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				} 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				func  userBanned ( b  * bot ,  update  * echotron . Update )  error  { 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
					m  :=  update . ChatMember 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
					c  :=  m . Chat 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
					u  :=  m . NewChatMember . User 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
					store  :=  tongo . NewStore [ db . User ] ( Client ) 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
					ctx ,  cancel  :=  context . WithTimeout ( context . Background ( ) ,  15 * time . Second ) 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
					defer  cancel ( ) 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
					if  user ,  err  :=  store . GetOne ( ctx ,  tongo . E ( "user_id" ,  u . ID ) ,  tongo . E ( "chat_id" ,  c . ID ) ) ;  err  ==  nil  {  //d.GetUser(ctx, db.User{UserId: sender.ID, ChatId: message.Chat.ID}); err == nil { 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
						store . DeleteByID ( ctx ,  user . Id ) 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
					} 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
					return  nil 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				} 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				func  checkCaptcha ( b  * bot ,  update  * echotron . Update )  error  { 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
					message  :=  update . Message 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
					sender  :=  message . From 
 
			
		 
		
	
	
		
			
				
					
					
						
					 
				
			
			 
			 
			
				@ -83,12 +110,12 @@ func checkCaptcha(b *bot, update *echotron.Update) error {
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
					// d := db.GetDatabase() 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
					ctx ,  cancel  :=  context . WithTimeout ( context . Background ( ) ,  15 * time . Second ) 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
					defer  cancel ( ) 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
					if  user ,  err  :=  store . GetOne ( ctx ,  tongo . E ( "user_id" ,  sender . ID ) ,  tongo . E ( "chat_id" ,  message . Chat . ID ) ) ;  err  ==  nil  {  //d.GetUser(ctx, db.User{UserId: sender.ID, ChatId: message.Chat.ID}); err == nil { 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
					if  user ,  err  :=  store . GetOne ( ctx ,  tongo . E ( "user_id" ,  sender . ID ) ,  tongo . E ( "chat_id" ,  message . Chat . ID ) ,  tongo . E ( "is_joined" ,  false )  );  err  ==  nil  {  //d.GetUser(ctx, db.User{UserId: sender.ID, ChatId: message.Chat.ID}); err == nil { 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
						chat ,  err  :=  chatStore . GetOne ( ctx ,  tongo . E ( "chat_id" ,  message . Chat . ID ) ) 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
						if  err  !=  nil  { 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
							return  err 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
						} 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
						if  message . Chat . IsForum  { 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
							chat ,  err  :=  chatStore . GetOne ( ctx ,  tongo . E ( "chat_id" ,  message . Chat . ID ) ) 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
							if  err  !=  nil  { 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
								return  err 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
							} 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
							if  message . ThreadID  !=  int ( chat . TopicId )  { 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
								b . DeleteMessage ( message . Chat . ID ,  message . ID ) 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
								text  :=  fmt . Sprintf ( "*%s*, сначала пройди капчу\\!" ,  UserMention ( sender ) ) 
 
			
		 
		
	
	
		
			
				
					
					
						
					 
				
			
			 
			 
			
				@ -108,6 +135,11 @@ func checkCaptcha(b *bot, update *echotron.Update) error {
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
								b . DeleteMessage ( message . Chat . ID ,  message . ID ) 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
								b . DeleteMessage ( message . Chat . ID ,  user . CaptchaMessage ) 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
								msg  :=  fmt . Sprintf ( "Капча успешно пройдена пользователем *%s*" ,  UserMention ( sender ) ) 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
								timeout  :=  10  *  time . Second 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
								if  chat . Greet  !=  ""  { 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
									msg  =  fmt . Sprintf ( chat . Greet ,  UserMention ( sender ) ) 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
									timeout  =  2  *  time . Minute 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
								} 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
								options  :=  echotron . MessageOptions { 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
									ParseMode :  echotron . MarkdownV2 , 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
								} 
 
			
		 
		
	
	
		
			
				
					
					
						
					 
				
			
			 
			 
			
				@ -118,7 +150,7 @@ func checkCaptcha(b *bot, update *echotron.Update) error {
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
								if  err  !=  nil  { 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
									log . Printf ( "Can't send welcome message: %s" ,  err ) 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
								} 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
								go  waitAndDelete ( & b . API ,  res . Result ,  10 * time . Second ) 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
								go  waitAndDelete ( & b . API ,  res . Result ,  timeout * time . Second ) 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
								// time.Sleep(time.Second * 10) 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
								// _, err = b.DeleteMessage(message.Chat.ID, res.Result.ID) 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
								if  err  !=  nil  { 
 
			
		 
		
	
	
		
			
				
					
					
						
					 
				
			
			 
			 
			
				@ -131,8 +163,7 @@ func checkCaptcha(b *bot, update *echotron.Update) error {
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
							b . DeleteMessage ( message . Chat . ID ,  user . CaptchaMessage ) 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
							b . DeleteMessage ( message . Chat . ID ,  user . JoinedMessage ) 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
							b . BanChatMember ( message . Chat . ID ,  sender . ID ,  nil ) 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
							user . IsBanned  =  true 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
							store . ReplaceItem ( ctx ,  * user ,  true ) 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
							store . DeleteByID ( ctx ,  user . Id ) 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
						} 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
					} 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
					return  nil 
 
			
		 
		
	
	
		
			
				
					
					
						
					 
				
			
			 
			 
			
				@ -162,6 +193,12 @@ func botAdded(b *bot, update *echotron.Update) error {
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				func  setTopic ( b  * bot ,  update  * echotron . Update )  error  { 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
					m  :=  update . Message 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
					if  res ,  err  :=  b . GetChatMember ( m . Chat . ID ,  m . From . ID ) ;  err  ==  nil  { 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
						m  :=  res . Result 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
						if  ! ( m . Status  ==  "administrator"  ||  m . Status  ==  "creator" )  { 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
							return  nil 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
						} 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
					} 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
					ctx ,  cancel  :=  context . WithTimeout ( context . Background ( ) ,  5 * time . Second ) 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
					defer  cancel ( ) 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
					store  :=  tongo . NewStore [ db . Chat ] ( Client )