mirror of
https://gitgud.io/yats/libkiwi.git
synced 2026-06-17 00:26:09 -04:00
100 lines
1.9 KiB
Go
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
|
|
}
|