summaryrefslogtreecommitdiff
path: root/internal/client/api/api.go
blob: 7fcde8b992bddd82f19c555e91e16257438bc5fa (plain)
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
package api

import (
	"errors"
	"fmt"
	"log"

	tea "github.com/charmbracelet/bubbletea"

	"github.com/kyren223/eko/internal/client/gateway"
	"github.com/kyren223/eko/internal/data"
	"github.com/kyren223/eko/internal/packet"
	"github.com/kyren223/eko/pkg/assert"
	"github.com/kyren223/eko/pkg/snowflake"
)

type (
	AppendMessage     data.Message
	UserProfileUpdate data.User
)

func SendMessage(message string) tea.Cmd {
	return func() tea.Msg {
		log.Println("request SendMessage sent")
		frequencyId := snowflake.ID(1852771536100921344)
		request := packet.SendMessage{
			Content:     message,
			FrequencyID: &frequencyId,
		}
		response, ok := <-gateway.Send(&request)
		if !ok {
			return errors.New("request SendMessage timeout")
		}
		log.Println("request SendMessage received response")

		switch response := response.(type) {
		case *packet.ErrorMessage:
			return errors.New(response.Error)
		case *packet.Messages:
			assert.Assert(len(response.Messages) == 1, "server must return only the one message that was sent")
			return AppendMessage(response.Messages[0])
		}
		return fmt.Errorf("received invalid response from server: %v", response.Type())
	}
}

func GetMessages() tea.Msg {
	log.Println("request GetMessages sent")
	frequencyId := snowflake.ID(1852771536100921344)
	request := packet.GetMessagesRange{
		FrequencyID: &frequencyId,
		ReceiverID:  nil,
		From:        nil,
		To:          nil,
	}
	response, ok := <-gateway.Send(&request)
	if !ok {
		return errors.New("request GetMessages timeout")
	}
	log.Println("request GetMessages received response")

	switch response := response.(type) {
	case *packet.ErrorMessage:
		return errors.New(response.Error)
	case *packet.Messages:
		return response
	}
	return fmt.Errorf("received invalid response from server: %v", response.Type())
}

func GetUserById(id snowflake.ID) tea.Cmd {
	return func() tea.Msg {
		log.Println("request GetUserById for ID", id, "sent")
		request := packet.GetUserByID{UserID: id}
		response, ok := <-gateway.Send(&request)
		if !ok {
			return errors.New("request GetUserById timeout")
		}
		log.Println("request GetUserById received response")

		switch response := response.(type) {
		case *packet.ErrorMessage:
			return errors.New(response.Error)
		case *packet.Users:
			if len(response.Users) == 0 {
				return fmt.Errorf("requested user id %v not found", id)
			}
			assert.Assert(len(response.Users) == 1, "server must return only one user with the matching id")
			return UserProfileUpdate(response.Users[0])
		}
		return fmt.Errorf("received invalid response from server: %v", response.Type())
	}
}