Files
libkiwi/account.go
T
2026-06-06 17:32:09 -04:00

100 lines
1.9 KiB
Go

package libkiwi
import (
"encoding/json"
"errors"
"net/url"
"strconv"
)
type LoginResp struct {
Status string `json:"status"`
Message string `json:"message"`
Redirect *url.URL `json:"redirect"`
Visitor Visitor `json:"visitor"`
}
func (lr *LoginResp) UnmarshalJSON(b []byte) error {
var jsonMap map[string]any
err := json.Unmarshal(b, &jsonMap)
if err != nil {
return err
}
for k, v := range jsonMap {
switch k {
case "status":
lr.Status = v.(string)
case "message":
lr.Message = v.(string)
case "redirect":
u, err := url.Parse(v.(string))
if err != nil {
return err
}
lr.Redirect = u
case "visitor":
vst, err := parseVisitorMap(v.(map[string]any))
if err != nil {
return err
}
lr.Visitor = vst
}
}
return nil
}
var ErrNoXFToken = errors.New("Failed to locate xfToken on page.")
type Visitor struct {
ConversationsUnread uint32 `json:"conversations_unread"`
AlertsUnviewed uint32 `json:"alerts_unviewed"`
TotalUnread uint32 `json:"total_unread"`
}
func (vst *Visitor) UnmarshalJSON(b []byte) error {
var jsonMap map[string]any
err := json.Unmarshal(b, &jsonMap)
if err != nil {
return err
}
newVst, err := parseVisitorMap(jsonMap)
if err != nil {
return err
}
*vst = newVst
return nil
}
func parseVisitorMap(jsonMap map[string]any) (Visitor, error) {
var out Visitor
for k, v := range jsonMap {
switch k {
case "conversations_unread":
convos, err := strconv.Atoi(v.(string))
if err != nil {
return out, err
}
out.ConversationsUnread = uint32(convos)
case "alerts_unviewed":
alerts, err := strconv.Atoi(v.(string))
if err != nil {
return out, err
}
out.AlertsUnviewed = uint32(alerts)
case "total_unread":
unread, err := strconv.Atoi(v.(string))
if err != nil {
return out, err
}
out.ConversationsUnread = uint32(unread)
}
}
return out, nil
}