forked from vadv/gopher-lua-libs
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathapi.go
149 lines (136 loc) · 3.69 KB
/
api.go
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
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
// Package telegram implements telegram api bot for lua.
package telegram
import (
"encoding/json"
lua_http "github.com/alexjx/gopher-lua-libs/http/client/interface"
lua_json "github.com/alexjx/gopher-lua-libs/json"
lua "github.com/yuin/gopher-lua"
)
// NewBot lua telegram.bot(tocken, http_ud.client) return telegram_bot_ud
func NewBot(L *lua.LState) int {
token := L.CheckString(1)
bot := &luaBot{token: token}
if L.GetTop() > 1 {
// http client
ud := L.CheckUserData(2)
if v, ok := ud.Value.(lua_http.LuaHTTPClient); ok {
bot.client = v
} else {
L.ArgError(2, "must be http_client_ud")
}
} else {
bot.client = lua_http.NewPureClient()
}
ud := L.NewUserData()
ud.Value = bot
L.SetMetatable(ud, L.GetTypeMetatable("telegram_bot_ud"))
L.Push(ud)
return 1
}
// GetUpdates lua telegram_bot_ud:get_updates() returns (table, err)
func GetUpdates(L *lua.LState) int {
bot := checkBot(L, 1)
var c *UpdateConfig
if L.GetTop() > 1 {
config := L.CheckTable(2)
// input to byte
data, err := lua_json.ValueEncode(config)
if err != nil {
L.Push(lua.LNil)
L.Push(lua.LString(err.Error()))
return 2
}
// byte to config
if err := json.Unmarshal(data, c); err != nil {
L.Push(lua.LNil)
L.Push(lua.LString(err.Error()))
return 2
}
}
updates, err := bot.getUpdates(c)
if err != nil {
L.Push(lua.LNil)
L.Push(lua.LString(err.Error()))
return 2
}
result, err := lua_json.ValueDecode(L, updatesToBytes(updates))
if err != nil {
L.Push(lua.LNil)
L.Push(lua.LString(err.Error()))
return 2
}
L.Push(result)
return 1
}
// GetOffset lua telegram_bot_ud:getOffset() returns int
func GetOffset(L *lua.LState) int {
bot := checkBot(L, 1)
L.Push(lua.LNumber(bot.offset))
return 1
}
// lua table -> byte -> Chattable
func sendGeneric(L *lua.LState, iface interface{}) int {
bot := checkBot(L, 1)
message := L.CheckTable(2)
c, ok := iface.(Chattable)
if !ok {
panic("must be chattable struct")
}
// input to byte
data, err := lua_json.ValueEncode(message)
if err != nil {
L.Push(lua.LNil)
L.Push(lua.LString(err.Error()))
return 2
}
// byte to chattable
if err := json.Unmarshal(data, c); err != nil {
L.Push(lua.LNil)
L.Push(lua.LString(err.Error()))
return 2
}
// send
response, err := bot.send(c)
if err != nil {
L.Push(lua.LNil)
L.Push(lua.LString(err.Error()))
return 2
}
// decode response
result, err := lua_json.ValueDecode(L, response.toBytes())
if err != nil {
L.Push(lua.LNil)
L.Push(lua.LString(err.Error()))
return 2
}
L.Push(result)
return 1
}
// SendMessage lua telegram_bot_ud:message(table) returns (table, err)
func SendMessage(L *lua.LState) int {
return sendGeneric(L, &MessageConfig{})
}
// ForwardMessage lua telegram_bot_ud:forward(table) returns (table, err)
func ForwardMessage(L *lua.LState) int {
return sendGeneric(L, &ForwardConfig{})
}
// SendPhoto lua telegram_bot_ud:photo(table) returns (table, err)
func SendPhoto(L *lua.LState) int {
return sendGeneric(L, &PhotoConfig{})
}
// EditMessageText lua telegram_bot_ud:editMessageText(table) returns (bool, err)
func EditMessageText(L *lua.LState) int {
return sendGeneric(L, &EditMessageTextConfig{})
}
// EditMessageCaption lua telegram_bot_ud:editMessageCaption(table) returns (bool, err)
func EditMessageCaption(L *lua.LState) int {
return sendGeneric(L, &EditMessageCaptionConfig{})
}
// EditMessageReplyMarkup lua telegram_bot_ud:editMessageReplyMarkup(table) returns (bool, err)
func EditMessageReplyMarkup(L *lua.LState) int {
return sendGeneric(L, &EditMessageReplyMarkupConfig{})
}
// EditMessageReplyMarkup lua telegram_bot_ud:deleteMessage(table) returns (bool, err)
func DeleteMessage(L *lua.LState) int {
return sendGeneric(L, &DeleteMessageConfig{})
}