delete/take/give
This commit is contained in:
		
							parent
							
								
									24bf4dc386
								
							
						
					
					
						commit
						aa2a229ad2
					
				
							
								
								
									
										152
									
								
								bot.go
									
									
									
									
									
								
							
							
						
						
									
										152
									
								
								bot.go
									
									
									
									
									
								
							@ -1,6 +1,8 @@
 | 
				
			|||||||
package main
 | 
					package main
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import (
 | 
					import (
 | 
				
			||||||
 | 
						"crypto/rand"
 | 
				
			||||||
 | 
						"encoding/hex"
 | 
				
			||||||
	"encoding/json"
 | 
						"encoding/json"
 | 
				
			||||||
	"fmt"
 | 
						"fmt"
 | 
				
			||||||
	"regexp"
 | 
						"regexp"
 | 
				
			||||||
@ -15,6 +17,14 @@ type Bot struct {
 | 
				
			|||||||
	Config *TelegramConfig
 | 
						Config *TelegramConfig
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type CompanyDeleteEntry struct {
 | 
				
			||||||
 | 
						CompanyID uint8
 | 
				
			||||||
 | 
						UserID    int
 | 
				
			||||||
 | 
						Time      time.Time
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					var companyDeleteMap map[string]*CompanyDeleteEntry
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (b *Bot) Start() {
 | 
					func (b *Bot) Start() {
 | 
				
			||||||
	var err error
 | 
						var err error
 | 
				
			||||||
	b.bot, err = tb.NewBot(tb.Settings{
 | 
						b.bot, err = tb.NewBot(tb.Settings{
 | 
				
			||||||
@ -24,6 +34,8 @@ func (b *Bot) Start() {
 | 
				
			|||||||
	})
 | 
						})
 | 
				
			||||||
	failError(err, "Bot.Start() : registering bot")
 | 
						failError(err, "Bot.Start() : registering bot")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						companyDeleteMap = make(map[string]*CompanyDeleteEntry)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	b.BotHandlers()
 | 
						b.BotHandlers()
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -118,17 +130,50 @@ func botUnpause(m *tb.Message) {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
func botDelete(m *tb.Message) {
 | 
					func botDelete(m *tb.Message) {
 | 
				
			||||||
	logInfoDebug("[%d] %s(%d) | %s(%d) : delete : %s\n", m.ID, m.Chat.Title, m.Chat.ID, m.Sender.Username, m.Sender.ID, m.Text)
 | 
						logInfoDebug("[%d] %s(%d) | %s(%d) : delete : %s\n", m.ID, m.Chat.Title, m.Chat.ID, m.Sender.Username, m.Sender.ID, m.Text)
 | 
				
			||||||
	if m.Sender.ID == int(bot.Config.AdminID) {
 | 
						r := regexp.MustCompile("/delete (?P<CompanyID>[0-9]+)")
 | 
				
			||||||
		r := regexp.MustCompile("/delete (?P<CompanyID>[0-9]+)")
 | 
						id := uint8(255)
 | 
				
			||||||
 | 
						if r.MatchString(m.Text) {
 | 
				
			||||||
		ID64, _ := strconv.ParseInt(r.ReplaceAllString(m.Text, "${CompanyID}"), 10, 64)
 | 
							ID64, _ := strconv.ParseInt(r.ReplaceAllString(m.Text, "${CompanyID}"), 10, 64)
 | 
				
			||||||
		if _, ok := srv.Status.Companies[uint8(ID64)]; ok {
 | 
							if m.Sender.ID == int(bot.Config.AdminID) {
 | 
				
			||||||
			srv.DeleteCompany(uint8(ID64))
 | 
								id = uint8(ID64)
 | 
				
			||||||
			bot.SendChat(m.Chat.ID, "Deleting")
 | 
							} else if cc, ok := cfg.Clients[m.Sender.ID]; ok && cc.CompanyID == uint8(ID64) {
 | 
				
			||||||
 | 
								id = cc.CompanyID
 | 
				
			||||||
		} else {
 | 
							} else {
 | 
				
			||||||
			bot.SendChat(m.Chat.ID, "Company doesn't exist")
 | 
								bot.SendChat(m.Chat.ID, "Not authorized to delete")
 | 
				
			||||||
 | 
								return
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
						} else if cc, ok := cfg.Clients[m.Sender.ID]; ok {
 | 
				
			||||||
 | 
							id = cc.CompanyID
 | 
				
			||||||
	} else {
 | 
						} else {
 | 
				
			||||||
		bot.SendChat(m.Chat.ID, "Not authorized to delete")
 | 
							bot.SendChat(m.Chat.ID, "User not registered")
 | 
				
			||||||
 | 
							return
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if id == 255 {
 | 
				
			||||||
 | 
							bot.SendChat(m.Chat.ID, "No company registered")
 | 
				
			||||||
 | 
							return
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if co, ok := srv.Status.Companies[id]; ok {
 | 
				
			||||||
 | 
							b := make([]byte, 8)
 | 
				
			||||||
 | 
							_, err := rand.Read(b)
 | 
				
			||||||
 | 
							logErrorDebug(err, "botDelete : rand.Read")
 | 
				
			||||||
 | 
							if err != nil {
 | 
				
			||||||
 | 
								bot.SendChat(m.Chat.ID, "internal error")
 | 
				
			||||||
 | 
								return
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							c := hex.EncodeToString(b)
 | 
				
			||||||
 | 
							d := &CompanyDeleteEntry{
 | 
				
			||||||
 | 
								CompanyID: id,
 | 
				
			||||||
 | 
								UserID:    m.Sender.ID,
 | 
				
			||||||
 | 
								Time:      time.Now(),
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							companyDeleteMap[c] = d
 | 
				
			||||||
 | 
							bot.SendChat(m.Chat.ID, fmt.Sprintf("Press /delete_%s to delete '%s'", c, co.Name))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						} else {
 | 
				
			||||||
 | 
							bot.SendChat(m.Chat.ID, "Company doesn't exist")
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	return
 | 
						return
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@ -179,11 +224,79 @@ func botPlayers(m *tb.Message) {
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func botGive(m *tb.Message) {
 | 
					func botGive(m *tb.Message) {
 | 
				
			||||||
	PrintText(m)
 | 
						if m.Sender.ID != int(cfg.Telegram.AdminID) {
 | 
				
			||||||
 | 
							bot.SendChat(m.Chat.ID, "Only the admin can use this command.")
 | 
				
			||||||
 | 
							return
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						r := regexp.MustCompile("^/give @(?P<Username>[a-zA-Z0-9]+) (?P<Duration>[a-z0-9]+)")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if !r.MatchString(m.Text) {
 | 
				
			||||||
 | 
							bot.SendChat(m.Chat.ID, "Wrong format.")
 | 
				
			||||||
 | 
							return
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						uStr := r.ReplaceAllString(m.Text, "${Username}")
 | 
				
			||||||
 | 
						var u int
 | 
				
			||||||
 | 
						for ccID, cc := range cfg.Clients {
 | 
				
			||||||
 | 
							if cc.Username == uStr {
 | 
				
			||||||
 | 
								u = ccID
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if u == 0 {
 | 
				
			||||||
 | 
							bot.SendChat(m.Chat.ID, "No such user found.")
 | 
				
			||||||
 | 
							return
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						dStr := r.ReplaceAllString(m.Text, "${Duration}")
 | 
				
			||||||
 | 
						d, err := time.ParseDuration(dStr)
 | 
				
			||||||
 | 
						logErrorDebug(err, "botGive : time.ParseDuration")
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							bot.SendChat(m.Chat.ID, "Cannot parse duration.")
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						cc := cfg.Clients[u]
 | 
				
			||||||
 | 
						cc.TimeLeft += d
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						bot.SendChat(m.Chat.ID, fmt.Sprintf("@%s now has %s left.", uStr, cc.TimeLeft))
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func botTake(m *tb.Message) {
 | 
					func botTake(m *tb.Message) {
 | 
				
			||||||
	PrintText(m)
 | 
						if m.Sender.ID != int(cfg.Telegram.AdminID) {
 | 
				
			||||||
 | 
							bot.SendChat(m.Chat.ID, "Only the admin can use this command.")
 | 
				
			||||||
 | 
							return
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						r := regexp.MustCompile("^/give @(?P<Username>[a-zA-Z0-9]+) (?P<Duration>[a-z0-9]+)")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if !r.MatchString(m.Text) {
 | 
				
			||||||
 | 
							bot.SendChat(m.Chat.ID, "Wrong format.")
 | 
				
			||||||
 | 
							return
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						uStr := r.ReplaceAllString(m.Text, "${Username}")
 | 
				
			||||||
 | 
						var u int
 | 
				
			||||||
 | 
						for ccID, cc := range cfg.Clients {
 | 
				
			||||||
 | 
							if cc.Username == uStr {
 | 
				
			||||||
 | 
								u = ccID
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if u == 0 {
 | 
				
			||||||
 | 
							bot.SendChat(m.Chat.ID, "No such user found.")
 | 
				
			||||||
 | 
							return
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						dStr := r.ReplaceAllString(m.Text, "${Duration}")
 | 
				
			||||||
 | 
						d, err := time.ParseDuration(dStr)
 | 
				
			||||||
 | 
						logErrorDebug(err, "botGive : time.ParseDuration")
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							bot.SendChat(m.Chat.ID, "Cannot parse duration.")
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						cc := cfg.Clients[u]
 | 
				
			||||||
 | 
						cc.TimeLeft -= d
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						bot.SendChat(m.Chat.ID, fmt.Sprintf("@%s now has %s left.", uStr, cc.TimeLeft))
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func botPasswd(m *tb.Message) {
 | 
					func botPasswd(m *tb.Message) {
 | 
				
			||||||
@ -362,5 +475,26 @@ func botQuery(q *tb.Query) {
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func botText(m *tb.Message) {
 | 
					func botText(m *tb.Message) {
 | 
				
			||||||
 | 
						r := regexp.MustCompile("^/delete_(??<Ref>[a-f0-9]{16})$")
 | 
				
			||||||
 | 
						if r.MatchString(m.Text) {
 | 
				
			||||||
 | 
							ref := r.ReplaceAllString(m.Text, "${Ref}")
 | 
				
			||||||
 | 
							d, ok := companyDeleteMap[ref]
 | 
				
			||||||
 | 
							if !ok {
 | 
				
			||||||
 | 
								bot.SendChat(m.Chat.ID, "No corresponding deletion request.")
 | 
				
			||||||
 | 
								return
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							if d.UserID != m.Sender.ID {
 | 
				
			||||||
 | 
								bot.SendChat(m.Chat.ID, "Requesting user has to confirm himself.")
 | 
				
			||||||
 | 
								return
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							if time.Now().Sub(d.Time) > time.Minute {
 | 
				
			||||||
 | 
								bot.SendChat(m.Chat.ID, "Request expired.")
 | 
				
			||||||
 | 
								return
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							srv.DeleteCompany(d.CompanyID)
 | 
				
			||||||
 | 
							bot.SendChat(m.Chat.ID, "Company deleted.")
 | 
				
			||||||
 | 
							delete(companyDeleteMap, ref)
 | 
				
			||||||
 | 
							return
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
	PrintText(m)
 | 
						PrintText(m)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
@ -1,6 +1,6 @@
 | 
				
			|||||||
// Code generated by version.sh (@generated) DO NOT EDIT.
 | 
					// Code generated by version.sh (@generated) DO NOT EDIT.
 | 
				
			||||||
package main
 | 
					package main
 | 
				
			||||||
var githash = "caba808"
 | 
					var githash = "24bf4dc"
 | 
				
			||||||
var buildstamp = "2021-11-12_01:17:14"
 | 
					var buildstamp = "2021-11-13_02:40:31"
 | 
				
			||||||
var commits = "188"
 | 
					var commits = "189"
 | 
				
			||||||
var version = "caba808-b188 - 2021-11-12_01:17:14"
 | 
					var version = "24bf4dc-b189 - 2021-11-13_02:40:31"
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user