Skip to content

Commit

Permalink
update
Browse files Browse the repository at this point in the history
  • Loading branch information
vildan-valeev committed Dec 9, 2023
1 parent a305e88 commit 2ab1d79
Show file tree
Hide file tree
Showing 9 changed files with 71 additions and 82 deletions.
20 changes: 11 additions & 9 deletions api.go
Original file line number Diff line number Diff line change
Expand Up @@ -24,37 +24,39 @@ func NewAPI(token string) API {
}

// GetUpdates https://dev.vk.com/ru/api/bots-long-poll/getting-started
func (a API) GetUpdates(opts *UpdateOptions) (res ResponseUpdate, err error) {
func (a API) GetUpdates(opts *UpdateOptions) (res APIResponseUpdate, err error) {
var vals = make(url.Values)
vals.Set("access_token", a.token)
vals.Set("v", APIVersion)

return getUpdates(a.base, "", urlValues(opts))
return get[APIResponseUpdate](opts.Server, "", addValues(vals, opts))
}

func (a API) MessagesSend(text string, chatID int64, opts *MessagesSendOptions) (res ResponseMessagesSend, err error) {
func (a API) MessagesSend(text string, chatID int64, opts *MessagesSendOptions) (res APIResponseMessagesSend, err error) {
var vals = make(url.Values)
vals.Set("message", text)
vals.Set("chat_id", strconv.FormatInt(chatID, 10))

return get[ResponseMessagesSend](a.base, "messages.send", addValues(vals, opts))
vals.Set("access_token", a.token)
vals.Set("v", APIVersion)
vals.Set("random_id", "0")
return get[APIResponseMessagesSend](a.base, "messages.send", addValues(vals, opts))
}

// MessagesGetLongPollServer https://dev.vk.com/ru/method/groups.getLongPollServer
func (a API) GroupsGetLongPollServer(opts *GetLongPollServerOptions) (res ResponseGetLongPollServer, err error) {
func (a API) GroupsGetLongPollServer(opts *GetLongPollServerOptions) (res APIResponseGetLongPollServer, err error) {
var vals = make(url.Values)
vals.Set("access_token", a.token)
vals.Set("v", APIVersion)
return get[ResponseGetLongPollServer](a.base, "groups.getLongPollServer", addValues(vals, opts))
return get[APIResponseGetLongPollServer](a.base, "groups.getLongPollServer", addValues(vals, opts))

}

// GroupsSetLongPollSettings https://dev.vk.com/ru/method/groups.setLongPollSettings
func (a API) GroupsSetLongPollSettings(opts *SetLongPollSettingsOptions) (res ResponseSetLongPollSettings, err error) {
func (a API) GroupsSetLongPollSettings(opts *SetLongPollSettingsOptions) (res APIResponseSetLongPollSettings, err error) {
var vals = make(url.Values)

vals.Set("access_token", a.token)
vals.Set("v", APIVersion)
return get[ResponseSetLongPollSettings](a.base, "groups.setLongPollSettings", addValues(vals, opts))
return get[APIResponseSetLongPollSettings](a.base, "groups.setLongPollSettings", addValues(vals, opts))

}
6 changes: 4 additions & 2 deletions apierror.go
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
package gvk

import "fmt"
import (
"fmt"
)

type APIError struct {
Code int64 `json:"error_code"` // todo const type
Expand All @@ -13,7 +15,7 @@ type APIError struct {

// Error returns the error string.
func (a APIError) Error() string {
return fmt.Sprintf("API error: %d %s", a.Code, a.Message)
return fmt.Sprintf("API error: %d %s. %s", a.Code, a.Message, a.Text)
}

func (a APIError) Base() APIError {
Expand Down
22 changes: 11 additions & 11 deletions dispatcher.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import (
"log"
"net/http"
"sync"
"time"
)

type Bot interface {
Expand Down Expand Up @@ -46,7 +47,6 @@ func NewDispatcher(token string, groupID int64, newBotFn NewBotFn) (*Dispatcher,
}

go d.listen()

return d, nil
}

Expand Down Expand Up @@ -79,13 +79,13 @@ func (d *Dispatcher) PollOptions(dropPendingUpdates bool, opts UpdateOptions) er
//if isFirstRun {
// opts.Timeout = 0
//}

response, err := d.api.GetUpdates(&opts)
time.Sleep(2 * time.Second)
result, err := d.api.GetUpdates(&opts)
if err != nil {
return err
}

err = d.check(response)
err = d.check(result)
if err != nil {
return err
}
Expand All @@ -95,7 +95,7 @@ func (d *Dispatcher) PollOptions(dropPendingUpdates bool, opts UpdateOptions) er
// d.updates <- u
// }
//}
for _, u := range response.Updates {
for _, u := range result.Updates {
d.updates <- u
}
//if l := len(response.Result); l > 0 {
Expand Down Expand Up @@ -133,11 +133,11 @@ func (d *Dispatcher) updateServer(updateTs bool) error {
return err
}

d.Key = serverSetting.Key
d.Server = serverSetting.Server
d.Key = serverSetting.Response.Key
d.Server = serverSetting.Response.Server

if updateTs {
d.Ts = serverSetting.Ts
d.Ts = serverSetting.Response.Ts
}

return nil
Expand All @@ -151,11 +151,11 @@ func (d *Dispatcher) autoSetting(ctx context.Context) error {
APIVersion: APIVersion,
}
_, err := d.api.GroupsSetLongPollSettings(&opts)

log.Println("SetLongPollSettings", err)
return err
}

func (d *Dispatcher) check(r ResponseUpdate) (err error) {
func (d *Dispatcher) check(r APIResponseUpdate) (err error) {
switch r.Failed {
case 0:
d.Ts = r.Ts
Expand All @@ -166,7 +166,7 @@ func (d *Dispatcher) check(r ResponseUpdate) (err error) {
case 3:
err = d.updateServer(true)
default:
log.Println(err)
log.Println("Dispatcher update check", err)
//err = &APIError{failed: r.failed}
}
return nil
Expand Down
1 change: 0 additions & 1 deletion error.go

This file was deleted.

2 changes: 1 addition & 1 deletion event_message_new.go
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ type ClientInfo struct {
type Message struct {
ID int `json:"id"` // Message ID
Date int `json:"date"`
PeerID int `json:"peer_id"` // Peer ID
PeerID int64 `json:"peer_id"` // Peer ID
FromID int64 `json:"from_id"`
Text string `json:"text"` // Message text
RandomID int `json:"random_id"`
Expand Down
12 changes: 8 additions & 4 deletions example/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -38,22 +38,26 @@ func (b *Bot) Update(update *gvk.Update) {
}

func (b *Bot) EntryHandler(update *gvk.Update) stateFn {
log.Printf("ПОЛУЧЕНО СООБЩЕНИЕ! %s \n", update.MessageNew.Message.Text)
if strings.HasPrefix(update.MessageNew.Message.Text, "ping") {
b.MessagesSend(
"pong",
update.MessageNew.Message.FromID,
&gvk.MessagesSendOptions{
UserID: update.MessageNew.Message.FromID,
PeerID: 0})
UserID: b.chatID,
PeerID: update.MessageNew.Message.PeerID,
RandomID: 0,
})

return b.handleNext
}

b.MessagesSend(
"not understand...",
update.MessageNew.Message.FromID,
&gvk.MessagesSendOptions{
UserID: update.MessageNew.Message.FromID,
PeerID: 0})
UserID: b.chatID,
PeerID: update.MessageNew.Message.PeerID})

return b.EntryHandler
}
Expand Down
2 changes: 1 addition & 1 deletion querybuilder.go
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@ func scan(i any, v url.Values) url.Values {

for i := 0; i < e.NumField(); i++ {
fTag := e.Type().Field(i).Tag

// TODO: peer_id = 0 !!! is valid!
if name := fTag.Get("query"); name != "" && !e.Field(i).IsZero() {
v.Set(name, toString(e.Field(i)))
}
Expand Down
41 changes: 3 additions & 38 deletions requests.go
Original file line number Diff line number Diff line change
Expand Up @@ -30,29 +30,7 @@ func get[T Response](base, endpoint string, vals url.Values) (res T, err error)
return
}

return
}

func getUpdates(base, endpoint string, vals url.Values) (res ResponseUpdate, err error) {
url, err := url.JoinPath(base, endpoint)
if err != nil {
return res, err
}

if vals != nil {
if queries := vals.Encode(); queries != "" {
url = fmt.Sprintf("%s?%s", url, queries)
}
}

cnt, err := SendGetRequest(url)
if err != nil {
return res, err
}

if err = json.Unmarshal(cnt, &res); err != nil {
return
}
err = check(res)

return
}
Expand All @@ -74,21 +52,8 @@ func SendGetRequest(url string) ([]byte, error) {
return data, nil
}

func check(r APIError) error {
//switch r.failed {
//case 0:
// d.Ts = r.Ts
//case 1:
// d.Ts = r.Ts
//case 2:
// err = d.updateServer(false)
//case 3:
// err = d.updateServer(true)
//default:
// err = &LongPoolError{failed: r.failed}
//}
//return nil
func check(r Response) error {
e := r.Base()
log.Println(e.Code, e.Message)
log.Println("API ERROR:", e.Code, e.Message)
return nil
}
47 changes: 32 additions & 15 deletions responses.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,43 +4,58 @@ type Response interface {
Base() APIError
}

type ResponseMessagesSend struct {
APIError // ошибка
Response int `json:"response,omitempty"`
//---------------------------------------------------------------

type APIResponseMessagesSend struct {
Error APIError `json:"error,omitempty"`
Response int `json:"response,omitempty"`
}

func (a APIResponseMessagesSend) Base() APIError {
return a.Error
}

func (a ResponseMessagesSend) Base() APIError {
return a.APIError
//---------------------------------------------------------------

type APIResponseGetLongPollServer struct {
Response ResponseGetLongPollServer `json:"response,omitempty"`
Error APIError `json:"error,omitempty"`
}

type ResponseGetLongPollServer struct {
Key string `json:"key,omitempty"`
Server string `json:"server,omitempty"`
Ts string `json:"ts,omitempty"`
APIError
}

func (a ResponseGetLongPollServer) Base() APIError {
return a.APIError
func (a APIResponseGetLongPollServer) Base() APIError {
return a.Error
}

// ---------------------------------------------------------------
type APIResponseSetLongPollSettings struct {
Response ResponseSetLongPollSettings `json:"response,omitempty"`
Error APIError `json:"error,omitempty"`
}

type ResponseSetLongPollSettings struct {
APIError
}

func (a ResponseSetLongPollSettings) Base() APIError {
return a.APIError
func (a APIResponseSetLongPollSettings) Base() APIError {
return a.Error
}

type ResponseUpdate struct {
//---------------------------------------------------------------

type APIResponseUpdate struct {
Ts string `json:"ts,omitempty"`
Updates []*Update `json:"updates,omitempty"`
Failed int64 `json:"failed,omitempty"` // ошибка
Error APIError `json:"error,omitempty"`
}

func (a ResponseUpdate) Base() APIError {
// TODO переделать
return APIError{Code: a.Failed}
func (a APIResponseUpdate) Base() APIError {
return a.Error
}

type Update struct {
Expand All @@ -53,6 +68,8 @@ type Update struct {
//TODO: добавить остальные объекты
}

//---------------------------------------------------------------

// ChatID returns the ID of the chat the update is coming from.
func (u Update) ChatID() int64 {
switch {
Expand Down

0 comments on commit 2ab1d79

Please sign in to comment.