package backendclient import ( "context" "encoding/base64" "net/http" ) // FeedbackReplyResp is the operator reply shown back to the player. type FeedbackReplyResp struct { Body string `json:"body"` RepliedAtUnix int64 `json:"replied_at_unix"` } // FeedbackStateResp is the player's feedback screen state. Reply is nil when there // is none to show. type FeedbackStateResp struct { CanSend bool `json:"can_send"` BlockedReason string `json:"blocked_reason"` Reply *FeedbackReplyResp `json:"reply,omitempty"` } // FeedbackUnreadResp reports whether the player has an undelivered operator reply. type FeedbackUnreadResp struct { ReplyUnread bool `json:"reply_unread"` } // FeedbackSubmit posts a feedback message. The attachment bytes are base64-encoded // into the JSON body for the internal hop; clientIP rides X-Forwarded-For. func (c *Client) FeedbackSubmit(ctx context.Context, userID, body string, attachment []byte, attachmentName, channel, version, clientIP string) error { payload := map[string]string{ "body": body, "attachment": "", "attachment_name": attachmentName, "channel": channel, "version": version, } if len(attachment) > 0 { payload["attachment"] = base64.StdEncoding.EncodeToString(attachment) } return c.do(ctx, http.MethodPost, "/api/v1/user/feedback", userID, clientIP, payload, nil) } // FeedbackGet returns the player's feedback screen state, marking any pending reply // delivered (clearing the badge). func (c *Client) FeedbackGet(ctx context.Context, userID string) (FeedbackStateResp, error) { var out FeedbackStateResp err := c.do(ctx, http.MethodGet, "/api/v1/user/feedback", userID, "", nil, &out) return out, err } // FeedbackUnread reports whether the player has an undelivered operator reply. func (c *Client) FeedbackUnread(ctx context.Context, userID string) (FeedbackUnreadResp, error) { var out FeedbackUnreadResp err := c.do(ctx, http.MethodGet, "/api/v1/user/feedback/unread", userID, "", nil, &out) return out, err }