Skip to content

Commit 485a806

Browse files
committed
project: add deleting the link
1 parent 310b57f commit 485a806

File tree

8 files changed

+94
-50
lines changed

8 files changed

+94
-50
lines changed

configs/config.toml

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,15 +3,18 @@ redirect_url = "https://t.me/PocketerBot/"
33

44
[messages]
55
[messages.responses]
6-
start = "Привет! Чтобы сохранять ссылки в своем Pocket аккаунте или получить их, для начала тебе необходимо дать мне на это доступ. Для этого переходи по ссылке:\n%s"
6+
start = "Привет! Чтобы использовать возможности бота (список доступных команд можно узнать введя команду /help), тебе необходимо предоставить мне доступ к твоему Pocket аккаунту. Для этого переходи по ссылке:\n%s"
7+
help = "Я могу выполнять такие действия, как:\n1. Добавление ссылки в твой Pocket. Для добавления достаточно отправить мне ссылку, а я ее сохраню\n2. Получение всех ссылок из твоего Pocket. Для этого воспользуйся командой /get\n3. Удаление ссылки по ID. Удаление можно воспроизвести командой /delete id, где id - идентификатор ссылки, который можно получить при помощи команды /get"
78
already_authorized = "Ты уже авторизован, отправляй ссылку, а я её сохраню."
89
saved_successfully = "Ссылка была успешно сохранена!"
10+
deleted_successfully = "Ссылка была успешно удалена!"
911
unknown_command = "Я не знаю такой комманды."
1012
[messages.errors]
1113
default = "Произошла непредвиденная ошибка."
1214
invalid_url = "Это не ссылка!"
1315
unauthorized = "Ты не авторизован, используй команду /start для авторизации."
1416
failed_to_save = "Не удалось добавить ссылку в твой Pocket список, попробуй чуть позже."
1517
failed_to_get = "Не удалось получить ссылки из твоего списка, попробуй чуть позже."
18+
failed_to_delete = "Не удалось удалить ссылку, похоже, ее нет твоем списке."
1619
failed_to_authorized = "Мне не удалось тебя авторизоровать."
1720
failed_to_generate = "Не удалось создать авторизационную ссылку."

go.mod

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,10 @@ module github.com/Lapp-coder/pocketer-telegram-bot
33
go 1.17
44

55
require (
6-
github.com/Lapp-coder/go-pocket-sdk v1.0.3
6+
github.com/Lapp-coder/go-pocket-sdk v1.0.5
77
github.com/boltdb/bolt v1.3.1
88
github.com/go-telegram-bot-api/telegram-bot-api v4.6.4+incompatible
9+
github.com/sirupsen/logrus v1.8.1
910
github.com/spf13/viper v1.8.1
1011
github.com/technoweenie/multipartstreamer v1.0.1 // indirect
1112
github.com/tidwall/pretty v1.2.0 // indirect
@@ -17,14 +18,13 @@ require (
1718
github.com/magiconair/properties v1.8.5 // indirect
1819
github.com/mitchellh/mapstructure v1.4.1 // indirect
1920
github.com/pelletier/go-toml v1.9.3 // indirect
20-
github.com/sirupsen/logrus v1.8.1 // indirect
2121
github.com/spf13/afero v1.6.0 // indirect
2222
github.com/spf13/cast v1.3.1 // indirect
2323
github.com/spf13/jwalterweatherman v1.1.0 // indirect
2424
github.com/spf13/pflag v1.0.5 // indirect
2525
github.com/subosito/gotenv v1.2.0 // indirect
26-
github.com/tidwall/gjson v1.8.1 // indirect
27-
github.com/tidwall/match v1.0.3 // indirect
26+
github.com/tidwall/gjson v1.13.0 // indirect
27+
github.com/tidwall/match v1.1.1 // indirect
2828
golang.org/x/sys v0.0.0-20210510120138-977fb7262007 // indirect
2929
golang.org/x/text v0.3.5 // indirect
3030
gopkg.in/ini.v1 v1.62.0 // indirect

go.sum

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -39,8 +39,8 @@ cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9
3939
dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU=
4040
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
4141
github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=
42-
github.com/Lapp-coder/go-pocket-sdk v1.0.3 h1:JAT1NeN5DbFdHSNOeZNk1SN0Y3zPd8GY8/tjcBG3rDA=
43-
github.com/Lapp-coder/go-pocket-sdk v1.0.3/go.mod h1:p0CDlZxmvi8KFZF7rO2FevhWiXHRYFbWPAFyXzrvJ68=
42+
github.com/Lapp-coder/go-pocket-sdk v1.0.5 h1:nmmZHuMam0huNrLghwzlycYtSp9jpUO/xADpMbXNAQU=
43+
github.com/Lapp-coder/go-pocket-sdk v1.0.5/go.mod h1:hj1aoBRRGpIHOj8EUaBgiiACUHFVO8lpt8AKEKEg9xI=
4444
github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY=
4545
github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o=
4646
github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY=
@@ -238,11 +238,12 @@ github.com/subosito/gotenv v1.2.0 h1:Slr1R9HxAlEKefgq5jn9U+DnETlIUa6HfgEzj0g5d7s
238238
github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw=
239239
github.com/technoweenie/multipartstreamer v1.0.1 h1:XRztA5MXiR1TIRHxH2uNxXxaIkKQDeX7m2XsSOlQEnM=
240240
github.com/technoweenie/multipartstreamer v1.0.1/go.mod h1:jNVxdtShOxzAsukZwTSw6MDx5eUJoiEBsSvzDU9uzog=
241-
github.com/tidwall/gjson v1.8.1 h1:8j5EE9Hrh3l9Od1OIEDAb7IpezNA20UdRngNAj5N0WU=
242-
github.com/tidwall/gjson v1.8.1/go.mod h1:5/xDoumyyDNerp2U36lyolv46b3uF/9Bu6OfyQ9GImk=
243-
github.com/tidwall/match v1.0.3 h1:FQUVvBImDutD8wJLN6c5eMzWtjgONK9MwIBCOrUJKeE=
241+
github.com/tidwall/gjson v1.9.1/go.mod h1:jydLKE7s8J0+1/5jC4eXcuFlzKizGrCKvLmBVX/5oXc=
242+
github.com/tidwall/gjson v1.13.0 h1:3TFY9yxOQShrvmjdM76K+jc66zJeT6D3/VFFYCGQf7M=
243+
github.com/tidwall/gjson v1.13.0/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=
244244
github.com/tidwall/match v1.0.3/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM=
245-
github.com/tidwall/pretty v1.1.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk=
245+
github.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA=
246+
github.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM=
246247
github.com/tidwall/pretty v1.2.0 h1:RWIZEg2iJ8/g6fDDYzMpobmaoGh5OLl4AXtGUGPcqCs=
247248
github.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU=
248249
github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=

internal/config/config.go

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,10 +18,12 @@ type Messages struct {
1818
}
1919

2020
type Responses struct {
21-
Start string `mapstructure:"start"`
22-
AlreadyAuthorized string `mapstructure:"already_authorized"`
23-
SavedSuccessfully string `mapstructure:"saved_successfully"`
24-
UnknownCommand string `mapstructure:"unknown_command"`
21+
Start string `mapstructure:"start"`
22+
Help string `mapstructure:"help"`
23+
AlreadyAuthorized string `mapstructure:"already_authorized"`
24+
SavedSuccessfully string `mapstructure:"saved_successfully"`
25+
DeletedSuccessfully string `mapstructure:"deleted_successfully"`
26+
UnknownCommand string `mapstructure:"unknown_command"`
2527
}
2628

2729
type Errors struct {
@@ -30,6 +32,7 @@ type Errors struct {
3032
Unauthorized string `mapstructure:"unauthorized"`
3133
FailedToSave string `mapstructure:"failed_to_save"`
3234
FailedToGet string `mapstructure:"failed_to_get"`
35+
FailedToDelete string `mapstructure:"failed_to_delete"`
3336
FailedToAuthorized string `mapstructure:"failed_to_authorized"`
3437
FailedToGenerate string `mapstructure:"failed_to_generate"`
3538
}

internal/telegram/auth.go

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,23 @@ import (
88
tgbotapi "github.com/go-telegram-bot-api/telegram-bot-api"
99
)
1010

11+
func (b *Bot) getAccessTokenIfAuthorized(chatID int64) (string, error) {
12+
accessToken, err := b.getAccessToken(chatID)
13+
if err != nil {
14+
requestToken, err := b.getRequestToken(chatID)
15+
if err != nil {
16+
return "", errUnauthorized
17+
}
18+
19+
accessToken, err = b.userAuthentication(chatID, requestToken)
20+
if err != nil {
21+
return "", errFailedToAuthorized
22+
}
23+
}
24+
25+
return accessToken, nil
26+
}
27+
1128
func (b *Bot) userAuthentication(chatID int64, requestToken string) (string, error) {
1229
auth, err := b.pocketClient.Authorize(context.Background(), requestToken)
1330
if err != nil {
@@ -52,7 +69,7 @@ func (b *Bot) generateAuthorizationLink(chatID int64) (string, error) {
5269
return "", err
5370
}
5471

55-
return b.pocketClient.GetAuthorizationURL(requestToken, redirectURL)
72+
return b.pocketClient.GetAuthorizationURL(requestToken)
5673
}
5774

5875
func (b Bot) generateRedirectURL() string {

internal/telegram/bot.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ func NewBot(bot *tgbotapi.BotAPI, storage storage.TokenStorage, pocketClient *po
2121
}
2222

2323
func (b *Bot) Start() error {
24-
logrus.Infof("Authorized on account %s", b.bot.Self.UserName)
24+
logrus.Infof("%s is started", b.bot.Self.UserName)
2525

2626
updates, err := b.initUpdatesChannel()
2727
if err != nil {

internal/telegram/errors.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ var (
77
errUnauthorized = errors.New("user is not authorized")
88
errFailedToSave = errors.New("failed to save")
99
errFailedToGet = errors.New("failed to get")
10+
errFailedToDelete = errors.New("failed to delete")
1011
errFailedToAuthorized = errors.New("failed to authorize user")
1112
errFailedToGenerateAuthLink = errors.New("failed to generate authorization link")
1213
)

internal/telegram/handlers.go

Lines changed: 52 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -2,16 +2,18 @@ package telegram
22

33
import (
44
"context"
5+
"fmt"
56
"net/url"
67

78
pocket "github.com/Lapp-coder/go-pocket-sdk"
89
tgbotapi "github.com/go-telegram-bot-api/telegram-bot-api"
9-
"github.com/sirupsen/logrus"
1010
)
1111

1212
const (
13-
commandStart = "start"
14-
commandGet = "get"
13+
commandStart = "start"
14+
commandHelp = "help"
15+
commandGet = "get"
16+
commandDelete = "delete"
1517
)
1618

1719
func (b *Bot) handleUpdates(updates tgbotapi.UpdatesChannel) {
@@ -37,37 +39,32 @@ func (b *Bot) handleCommand(message *tgbotapi.Message) error {
3739
switch message.Command() {
3840
case commandStart:
3941
return b.handleStartCommand(message)
42+
case commandHelp:
43+
return b.handleHelpCommand(message)
4044
case commandGet:
4145
return b.handleGetCommand(message)
46+
case commandDelete:
47+
return b.handleDeleteCommand(message)
4248
default:
4349
return b.handleUnknownCommand(message)
4450
}
4551
}
4652

4753
func (b *Bot) handleMessage(message *tgbotapi.Message) error {
48-
msg := tgbotapi.NewMessage(message.Chat.ID, b.messages.Responses.SavedSuccessfully)
49-
5054
if _, err := url.ParseRequestURI(message.Text); err != nil {
5155
return errInvalidURL
5256
}
5357

54-
accessToken, err := b.getAccessToken(message.Chat.ID)
58+
accessToken, err := b.getAccessTokenIfAuthorized(message.Chat.ID)
5559
if err != nil {
56-
requestToken, err := b.getRequestToken(message.Chat.ID)
57-
if err != nil {
58-
return errUnauthorized
59-
}
60-
61-
accessToken, err = b.userAuthentication(message.Chat.ID, requestToken)
62-
if err != nil {
63-
return errFailedToAuthorized
64-
}
60+
return err
6561
}
6662

6763
if err = b.pocketClient.Add(context.Background(), pocket.AddInput{AccessToken: accessToken, URL: message.Text}); err != nil {
6864
return errFailedToSave
6965
}
7066

67+
msg := tgbotapi.NewMessage(message.Chat.ID, b.messages.Responses.SavedSuccessfully)
7168
_, err = b.bot.Send(msg)
7269
return err
7370
}
@@ -83,20 +80,18 @@ func (b *Bot) handleStartCommand(message *tgbotapi.Message) error {
8380
return err
8481
}
8582

83+
func (b *Bot) handleHelpCommand(message *tgbotapi.Message) error {
84+
msg := tgbotapi.NewMessage(message.Chat.ID, b.messages.Responses.Help)
85+
_, err := b.bot.Send(msg)
86+
return err
87+
}
88+
8689
func (b *Bot) handleGetCommand(message *tgbotapi.Message) error {
8790
msg := tgbotapi.NewMessage(message.Chat.ID, "")
8891

89-
accessToken, err := b.getAccessToken(message.Chat.ID)
92+
accessToken, err := b.getAccessTokenIfAuthorized(message.Chat.ID)
9093
if err != nil {
91-
requestToken, err := b.getRequestToken(message.Chat.ID)
92-
if err != nil {
93-
return errUnauthorized
94-
}
95-
96-
accessToken, err = b.userAuthentication(message.Chat.ID, requestToken)
97-
if err != nil {
98-
return errFailedToAuthorized
99-
}
94+
return err
10095
}
10196

10297
items, err := b.pocketClient.Retrieving(context.Background(), pocket.RetrievingInput{AccessToken: accessToken})
@@ -105,26 +100,44 @@ func (b *Bot) handleGetCommand(message *tgbotapi.Message) error {
105100
}
106101

107102
for _, item := range items {
108-
msg.Text = item.GivenUrl
109-
if _, err = b.bot.Send(msg); err != nil {
110-
return err
111-
}
103+
msg.Text = fmt.Sprintf("%s\nID: %s", item.GivenURL, item.ID)
104+
b.bot.Send(msg)
112105
}
113106

114107
return nil
115108
}
116109

110+
func (b *Bot) handleDeleteCommand(message *tgbotapi.Message) error {
111+
accessToken, err := b.getAccessTokenIfAuthorized(message.Chat.ID)
112+
if err != nil {
113+
return err
114+
}
115+
116+
input := pocket.ModifyInput{
117+
AccessToken: accessToken,
118+
Actions: []pocket.Action{
119+
{
120+
Name: pocket.ActionDelete,
121+
ItemID: message.CommandArguments(),
122+
},
123+
},
124+
}
125+
if err = b.pocketClient.Modify(context.Background(), input); err != nil {
126+
return errFailedToDelete
127+
}
128+
129+
msg := tgbotapi.NewMessage(message.Chat.ID, b.messages.Responses.DeletedSuccessfully)
130+
_, err = b.bot.Send(msg)
131+
return err
132+
}
133+
117134
func (b *Bot) handleUnknownCommand(message *tgbotapi.Message) error {
118135
msg := tgbotapi.NewMessage(message.Chat.ID, b.messages.Responses.UnknownCommand)
119136
_, err := b.bot.Send(msg)
120137
return err
121138
}
122139

123140
func (b *Bot) handleError(chatID int64, err error) {
124-
logrus.Errorf(
125-
"Error occured when working bot, chatID: %d, error: %s",
126-
chatID, err.Error())
127-
128141
msg := tgbotapi.NewMessage(chatID, b.messages.Errors.Default)
129142

130143
switch err {
@@ -137,6 +150,12 @@ func (b *Bot) handleError(chatID int64, err error) {
137150
case errFailedToSave:
138151
msg.Text = b.messages.Errors.FailedToSave
139152
b.bot.Send(msg)
153+
case errFailedToGet:
154+
msg.Text = b.messages.Errors.FailedToGet
155+
b.bot.Send(msg)
156+
case errFailedToDelete:
157+
msg.Text = b.messages.Errors.FailedToDelete
158+
b.bot.Send(msg)
140159
case errFailedToAuthorized:
141160
msg.Text = b.messages.Errors.FailedToAuthorized
142161
b.bot.Send(msg)

0 commit comments

Comments
 (0)