aboutsummaryrefslogtreecommitdiff
path: root/telegram/commands.go
blob: 61e48825dfaff219aba2f453fb402bb3a5f5ee20 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
package telegram

import (
	"strings"
)

const notEnoughArguments string = "Not enough arguments"
const telegramNotInitialized string = "Telegram connection is not initialized yet"

var transportCommands = map[string]command{
	"login": command{"phone", "sign in"},
	//"logout":      command{"", "sign out"},
	"code":     command{"", "check one-time code"},
	"password": command{"", "check 2fa password"},
	//"setusername": command{"", "update @username"},
	//"setname":     command{"first last", "update name"},
	//"setbio":      command{"", "update about"},
	//"setpassword": command{"[old] [new]", "set or remove password"},
	//"config":      command{"[param] [value]", "view or update configuration options"},
}

var chatCommands = map[string]command{
	//"d":          command{"[n]", "delete your last message(s)"},
	//"s":          command{"regex replace", "edit your last message"},
	//"add":        command{"@username", "add @username to your chat list"},
	//"join":       command{"https://t.me/invite_link", "join to chat via invite link"},
	//"group":      command{"title", "create groupchat «title» with current user"},
	//"supergroup": command{"title description", "create new supergroup «title» with «description»"},
	//"channel":    command{"title description", "create new channel «title» with «description»"},
	//"secret":     command{"", "create secretchat with current user"},
	//"search":     command{"string [limit]", "search <string> in current chat"},
	//"history":    command{"[limit]", "get last [limit] messages from current chat"},
	//"block":      command{"", "blacklist current user"},
	//"unblock":    command{"", "unblacklist current user"},
	//"invite":     command{"id or @username", "add user to current chat"},
	//"kick":       command{"id or @username", "remove user to current chat"},
	//"ban":        command{"id or @username [hours]", "restrict @username from current chat for [hours] or forever"},
	//"leave":      command{"", "leave current chat"},
	//"close":      command{"", "close current secret chat"},
	//"delete":     command{"", "delete current chat from chat list"},
	//"members":    command{"[query]", "search members [by optional query] in current chat (requires admin rights)"},
}

var transportConfigurationOptions = map[string]configurationOption{
	//"timezone": configurationOption{"00:00", "adjust timezone for Telegram user statuses"}
}

type command struct {
	arguments   string
	description string
}
type configurationOption command

type helpType int

const (
	helpTypeTransport helpType = iota
	helpTypeChat
)

func helpString(ht helpType) string {
	var str strings.Builder
	var commandMap map[string]command

	switch ht {
	case helpTypeTransport:
		commandMap = transportCommands
	case helpTypeChat:
		commandMap = chatCommands
	}

	str.WriteString("Available commands:\n")
	for name, command := range commandMap {
		str.WriteString("/")
		str.WriteString(name)
		if command.arguments != "" {
			str.WriteString(" ")
			str.WriteString(command.arguments)
		}
		str.WriteString(" — ")
		str.WriteString(command.description)
		str.WriteString("\n")
	}

	if ht == helpTypeTransport {
		str.WriteString("Configuration options\n")
		for name, option := range transportConfigurationOptions {
			str.WriteString(name)
			str.WriteString(" ")
			str.WriteString(option.arguments)
			str.WriteString(" — ")
			str.WriteString(option.description)
			str.WriteString("\n")
		}
	}

	return str.String()
}

// ProcessTransportCommand executes commands sent directly to the component
func (c *Client) ProcessTransportCommand(cmd string, args []string) string {
	switch cmd {
	case "login", "code", "password":
		if cmd == "login" && c.Session.Login != "" {
			return ""
		}

		if len(args) < 1 {
			return notEnoughArguments
		}
		if c.authorizer == nil {
			return telegramNotInitialized
		}

		switch cmd {
		case "login":
			c.authorizer.PhoneNumber <- args[0]
			c.Session.Login = args[0]
		case "code":
			c.authorizer.Code <- args[0]
		case "password":
			c.authorizer.Password <- args[0]
		}
	case "help":
		return helpString(helpTypeTransport)
	}

	return ""
}