@@ -9,11 +9,11 @@ import (
99)
1010
1111type QueryRequest struct {
12- Secret string `json:"secret"`
13- IP string `json:"ip"`
14- DeviceID uint32 `json:"deviceID"`
15- Csnum string `json:"csnum"`
16- DiscordID string `json:"discordId"`
12+ Secret string `json:"secret"`
13+ IP string `json:"ip"`
14+ DeviceID uint32 `json:"deviceID"`
15+ Csnum string `json:"csnum"`
16+ DiscordID string `json:"discordID"`
1717 // 0: Either, 1: No Ban, 2: Ban
1818 HasBan byte `json:"hasban"`
1919}
@@ -32,17 +32,18 @@ var QueryRoute = MakeRouteSpec[QueryRequest, QueryResponse](
3232)
3333
3434var (
35- ErrInvalidIPFormat = errors .New ("Invalid IP Format. IPs must be in the format 'xx.xx.xx.xx'." )
36- ErrInvalidDeviceID = errors .New ("DeviceID cannot be 0." )
37- ErrInvalidCsnum = errors .New ("Csnums must be less than 16 characters long and match the format '^[a-zA-Z0-9]+$'." )
38- ErrInvalidDiscordID = errors .New ("Discord ID must be less than 18 characters long." )
39- ErrInvalidHasBan = errors .New ("HasBan must be either 0 (Either), 1 (No Ban), 2 (Ban)" )
40- ErrEmptyParams = errors .New ("At least one of IP, Csnum, and DeviceID must be nonzero or nonempty" )
41- ipRegex = regexp .MustCompile (`^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$` )
42- csnumRegex = regexp .MustCompile (`^[a-zA-Z0-9]+$` )
35+ ErrInvalidIPFormat = errors .New ("Invalid IP Format. IPs must be in the format 'xx.xx.xx.xx'." )
36+ ErrInvalidDeviceID = errors .New ("DeviceID cannot be 0." )
37+ ErrInvalidCsnum = errors .New ("Csnums must be less than 16 characters long and match the format '^[a-zA-Z0-9]+$'." )
38+ ErrInvalidDiscordID = errors .New ("Discord ID must be 18 or fewer characters long and all numbers." )
39+ ErrInvalidHasBan = errors .New ("HasBan must be either 0 (Either), 1 (No Ban), 2 (Ban)" )
40+ ErrEmptyParams = errors .New ("At least one of IP, Csnum, DeviceID, or DiscordID must be nonzero or nonempty" )
41+ ipRegex = regexp .MustCompile (`^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$` )
42+ csnumRegex = regexp .MustCompile (`^[a-zA-Z0-9]+$` )
43+ numOnlyRegex = regexp .MustCompile ("^[0-9]+$" )
4344)
4445
45- const QUERYBASE = `SELECT profile_id, user_id, gsbrcd, ng_device_id, email, unique_nick, firstname, lastname, has_ban, ban_reason, open_host, last_ingamesn, last_ip_address, csnum, ban_moderator, ban_reason_hidden, ban_issued, ban_expires FROM users WHERE`
46+ const QUERYBASE = `SELECT profile_id FROM users WHERE`
4647
4748func HandleQuery (req any , _ bool , _ * http.Request ) (any , int , error ) {
4849 _req := req .(QueryRequest )
@@ -55,7 +56,7 @@ func HandleQuery(req any, _ bool, _ *http.Request) (any, int, error) {
5556 return nil , http .StatusBadRequest , ErrInvalidCsnum
5657 }
5758
58- if _req .DiscordID != "" && len (_req .DiscordID ) > 18 {
59+ if _req .DiscordID != "" && ( len (_req .DiscordID ) > 18 || ! numOnlyRegex . MatchString ( _req . DiscordID )) {
5960 return nil , http .StatusBadRequest , ErrInvalidDiscordID
6061 }
6162
@@ -100,62 +101,34 @@ func HandleQuery(req any, _ bool, _ *http.Request) (any, int, error) {
100101 return nil , http .StatusInternalServerError , err
101102 }
102103
103- res := QueryResponse {}
104- res .Users = []database.User {}
104+ pids := []uint32 {}
105105
106106 count := 0
107107 for rows .Next () {
108108 count ++
109109
110- user := database.User {}
111-
112- // May be null
113- var firstName * string
114- var lastName * string
115- var banReason * string
116- var lastInGameSn * string
117- var lastIPAddress * string
118- var banModerator * string
119- var banHiddenReason * string
120-
121- err := rows .Scan (& user .ProfileId , & user .UserId , & user .GsbrCode , & user .NgDeviceId , & user .Email , & user .UniqueNick , & firstName , & lastName , & user .Restricted , & banReason , & user .OpenHost , & lastInGameSn , & lastIPAddress , & user .Csnum , & banModerator , & banHiddenReason , & user .BanIssued , & user .BanExpires )
122-
110+ var pid uint32
111+ err := rows .Scan (& pid )
123112 if err != nil {
124113 return nil , http .StatusInternalServerError , err
125114 }
126115
127- if firstName != nil {
128- user .FirstName = * firstName
129- }
130-
131- if lastName != nil {
132- user .LastName = * lastName
133- }
134-
135- if banReason != nil {
136- user .BanReason = * banReason
137- }
138-
139- if lastInGameSn != nil {
140- user .LastInGameSn = * lastInGameSn
141- }
116+ pids = append (pids , pid )
142117
143- if lastIPAddress != nil {
144- user . LastIPAddress = * lastIPAddress
145- }
118+ // TODO: Return a count of the total number of matches, do something
119+ // about returing 80000 matches if the query is vague enough
120+ }
146121
147- if banModerator != nil {
148- user .BanModerator = * banModerator
149- }
122+ res := QueryResponse {}
123+ res .Users = []database.User {}
150124
151- if banHiddenReason != nil {
152- user .BanReasonHidden = * banHiddenReason
125+ for _ , pid := range pids {
126+ user , err := database .GetProfile (pool , ctx , pid )
127+ if err != nil {
128+ return nil , http .StatusInternalServerError , err
153129 }
154130
155131 res .Users = append (res .Users , user )
156-
157- // TODO: Return a count of the total number of matches, do something
158- // about returing 80000 matches if the query is vague enough
159132 }
160133
161134 return res , http .StatusOK , nil
0 commit comments