diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..a453954 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +# GoLand +.idea/ \ No newline at end of file diff --git a/README.md b/README.md index 6ca2230..46f3a86 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,51 @@ # go-mcm -Go library for MCM \ No newline at end of file +Go library for MCM + +## Model Example +```go +package main + +import ( + "fmt" + "go.etztech.xyz/go-mcm/model" + "go.etztech.xyz/go-mcm/model/django" +) + +func main() { + query := model.NewQuery("", "https://24carrotcraft.com/whitelist/api") + builder := query.NewDjangoBuilder().Contains(django.PlayerUsername, "Etzelia") + + players, err := query.Player(builder) + if err != nil { + fmt.Println(err) + } + + fmt.Printf("%#v\n", players[0]) +} +``` + +Response (formatted) +```go +&model.Player{ + ID: 663, + AuthUserID: 0, + UUID: "de10775b-fcb1-4665-bce4-5924b2e30188", + Username: "MrsEtzelia", + ApplicationID: 1, + FirstSeen: "2016-12-18", + LastSeen: "2017-11-23", + Link: "https://www.24carrotcraft.com/whitelist/dashboard/player/663", +} + +&model.Player{ + ID: 724, + AuthUserID: 1, + UUID: "bf0446a8-9695-4c41-aa4c-7ff45bfd1171", + Username: "Etzelia", + ApplicationID: 838, + FirstSeen: "2016-12-02", + LastSeen: "2019-10-02", + Link: "https://www.24carrotcraft.com/whitelist/dashboard/player/724", +} +``` \ No newline at end of file diff --git a/go.mod b/go.mod new file mode 100644 index 0000000..709345b --- /dev/null +++ b/go.mod @@ -0,0 +1,3 @@ +module go.etztech.xyz/go-mcm + +go 1.13 diff --git a/model/alert.go b/model/alert.go new file mode 100644 index 0000000..4012019 --- /dev/null +++ b/model/alert.go @@ -0,0 +1,32 @@ +package model + +import ( + "encoding/json" + "go.etztech.xyz/go-mcm/model/django" +) + +type Alert struct { + ID int64 `json:"id"` + UserID int64 `json:"user_id"` + Message string `json:"message"` + Seen bool `json:"seen"` + Date string `json:"date"` + Link string `json:"link"` +} + +func (q *Query) Alert(builder *django.Builder) ([]*Alert, error) { + endpoint := q.endpoint("alert", builder.QueryString()) + alerts := make([]*Alert, 0) + + resp, err := response(endpoint) + if err != nil { + return nil, err + } + + err = json.Unmarshal(resp, &alerts) + if err != nil { + return nil, err + } + + return alerts, nil +} diff --git a/model/application.go b/model/application.go new file mode 100644 index 0000000..617bfde --- /dev/null +++ b/model/application.go @@ -0,0 +1,37 @@ +package model + +import ( + "encoding/json" + "go.etztech.xyz/go-mcm/model/django" +) + +type Application struct { + ID int64 `json:"id"` + Username string `json:"username"` + Age int64 `json:"age"` + PlayerType string `json:"player_type"` + EverBanned bool `json:"ever_banned"` + EverBannedExplanation string `json:"ever_banned_explanation"` + Reference string `json:"reference"` + ReadRules string `json:"read_rules"` + Accepted bool `json:"accepted"` + Date string `json:"date"` + Link string `json:"link"` +} + +func (q *Query) Application(builder *django.Builder) ([]*Application, error) { + endpoint := q.endpoint("application", builder.QueryString()) + applications := make([]*Application, 0) + + resp, err := response(endpoint) + if err != nil { + return nil, err + } + + err = json.Unmarshal(resp, &applications) + if err != nil { + return nil, err + } + + return applications, nil +} diff --git a/model/django/alert.go b/model/django/alert.go new file mode 100644 index 0000000..4ef6875 --- /dev/null +++ b/model/django/alert.go @@ -0,0 +1,10 @@ +package django + +const ( + AlertID = ID + AlertUserID = "user_id" + AlertMessage = "message" + AlertSeen = "seen" + AlertDate = "date" + AlertLink = Link +) diff --git a/model/django/application.go b/model/django/application.go new file mode 100644 index 0000000..cee8dbe --- /dev/null +++ b/model/django/application.go @@ -0,0 +1,15 @@ +package django + +const ( + ApplicationID = ID + ApplicationUsername = "username" + ApplicationAge = "age" + ApplicationPlayerType = "player_type" + ApplicationEverBanned = "ever_banned" + ApplicationEverBannedExplanation = "ever_banned_explanation" + ApplicationReference = "reference" + ApplicationReadRules = "read_rules" + ApplicationAccepted = "accepted" + ApplicationDate = "date" + ApplicationLink = Link +) diff --git a/model/django/django.go b/model/django/django.go new file mode 100644 index 0000000..ce50c34 --- /dev/null +++ b/model/django/django.go @@ -0,0 +1,163 @@ +package django + +import ( + "fmt" + "strings" +) + +const ( + ID = "id" + Link = "link" +) + +type Builder struct { + Params []string +} + +func NewBuilder(token string) *Builder { + return &Builder{[]string{fmt.Sprintf("api=%s", token)}} +} + +func (db *Builder) QueryString() string { + return "?" + strings.Join(db.Params, "&") +} + +func (db *Builder) Exact(field, value string) *Builder { + db.Params = append(db.Params, fmt.Sprintf("%s__exact=%s", field, value)) + return db +} + +func (db *Builder) IExact(field, value string) *Builder { + db.Params = append(db.Params, fmt.Sprintf("%s__iexact=%s", field, value)) + return db +} + +func (db *Builder) Contains(field, value string) *Builder { + db.Params = append(db.Params, fmt.Sprintf("%s__contains=%s", field, value)) + return db +} + +func (db *Builder) IContains(field, value string) *Builder { + db.Params = append(db.Params, fmt.Sprintf("%s__icontains=%s", field, value)) + return db +} + +func (db *Builder) In(field string, values ...string) *Builder { + db.Params = append(db.Params, fmt.Sprintf("%s__in=[%s]", field, strings.Join(values, ","))) + return db +} + +func (db *Builder) Gt(field, value string) *Builder { + db.Params = append(db.Params, fmt.Sprintf("%s__gt=%s", field, value)) + return db +} + +func (db *Builder) Gte(field, value string) *Builder { + db.Params = append(db.Params, fmt.Sprintf("%s__gte=%s", field, value)) + return db +} + +func (db *Builder) Lt(field, value string) *Builder { + db.Params = append(db.Params, fmt.Sprintf("%s__lt=%s", field, value)) + return db +} + +func (db *Builder) Lte(field, value string) *Builder { + db.Params = append(db.Params, fmt.Sprintf("%s__lte=%s", field, value)) + return db +} + +func (db *Builder) Startswith(field, value string) *Builder { + db.Params = append(db.Params, fmt.Sprintf("%s__startswith=%s", field, value)) + return db +} + +func (db *Builder) IStartswith(field, value string) *Builder { + db.Params = append(db.Params, fmt.Sprintf("%s__istartswith=%s", field, value)) + return db +} + +func (db *Builder) Endswith(field, value string) *Builder { + db.Params = append(db.Params, fmt.Sprintf("%s__endswith=%s", field, value)) + return db +} + +func (db *Builder) IEndswith(field, value string) *Builder { + db.Params = append(db.Params, fmt.Sprintf("%s__iendswith=%s", field, value)) + return db +} + +func (db *Builder) Range(field, from, to string) *Builder { + db.Params = append(db.Params, fmt.Sprintf("%s__range=(%s,%s)", field, from, to)) + return db +} + +func (db *Builder) Date(field, value string) *Builder { + db.Params = append(db.Params, fmt.Sprintf("%s__date=%s", field, value)) + return db +} + +func (db *Builder) Year(field, value string) *Builder { + db.Params = append(db.Params, fmt.Sprintf("%s__year=%s", field, value)) + return db +} + +func (db *Builder) Month(field, value string) *Builder { + db.Params = append(db.Params, fmt.Sprintf("%s__month=%s", field, value)) + return db +} + +func (db *Builder) Day(field, value string) *Builder { + db.Params = append(db.Params, fmt.Sprintf("%s__day=%s", field, value)) + return db +} + +func (db *Builder) Week(field, value string) *Builder { + db.Params = append(db.Params, fmt.Sprintf("%s__week=%s", field, value)) + return db +} + +func (db *Builder) WeekDay(field, value string) *Builder { + db.Params = append(db.Params, fmt.Sprintf("%s__week_day=%s", field, value)) + return db +} + +func (db *Builder) Quarter(field, value string) *Builder { + db.Params = append(db.Params, fmt.Sprintf("%s__quarter=%s", field, value)) + return db +} + +func (db *Builder) Time(field, value string) *Builder { + db.Params = append(db.Params, fmt.Sprintf("%s__time=%s", field, value)) + return db +} + +func (db *Builder) Hour(field, value string) *Builder { + db.Params = append(db.Params, fmt.Sprintf("%s__hour=%s", field, value)) + return db +} + +func (db *Builder) Minute(field, value string) *Builder { + db.Params = append(db.Params, fmt.Sprintf("%s__minute=%s", field, value)) + return db +} + +func (db *Builder) Second(field, value string) *Builder { + db.Params = append(db.Params, fmt.Sprintf("%s__second=%s", field, value)) + return db +} + +func (db *Builder) IsNull(field, value string) *Builder { + db.Params = append(db.Params, fmt.Sprintf("%s__isnull=%s", field, value)) + return db +} + +func (db *Builder) Regex(field, value string) *Builder { + db.Params = append(db.Params, fmt.Sprintf("%s__regex=r'%s'", field, value)) + return db +} + +func (db *Builder) IRegex(field, value string) *Builder { + db.Params = append(db.Params, fmt.Sprintf("%s__iregex=r'%s'", field, value)) + return db +} diff --git a/model/django/ip.go b/model/django/ip.go new file mode 100644 index 0000000..4b3fe95 --- /dev/null +++ b/model/django/ip.go @@ -0,0 +1,8 @@ +package django + +const ( + IPID = ID + IPPlayerID = "player_id" + IPLastUsed = "last_used" + IPLink = Link +) diff --git a/model/django/note.go b/model/django/note.go new file mode 100644 index 0000000..1f13127 --- /dev/null +++ b/model/django/note.go @@ -0,0 +1,11 @@ +package django + +const ( + NoteID = ID + NotePlayerID = "player_id" + NoteMessage = "message" + NoteImportance = "importance" + NoteStaffID = "staff_id" + NoteDate = "date" + NoteLink = Link +) diff --git a/model/django/player.go b/model/django/player.go new file mode 100644 index 0000000..da38872 --- /dev/null +++ b/model/django/player.go @@ -0,0 +1,12 @@ +package django + +const ( + PlayerID = ID + PlayerAuthUserID = "auth_user_id" + PlayerUUID = "uuid" + PlayerUsername = "username" + PlayerApplicationID = "application_id" + PlayerFirstSeen = "first_seen" + PlayerLastSeen = "last_seen" + PlayerLink = Link +) diff --git a/model/django/ticket.go b/model/django/ticket.go new file mode 100644 index 0000000..39ac4c2 --- /dev/null +++ b/model/django/ticket.go @@ -0,0 +1,16 @@ +package django + +const ( + TicketID = ID + TicketPlayerID = "player_id" + TicketMessage = "message" + TicketPriority = "priority" + TicketStaffID = "staff_id" + TicketResolved = "resolved" + TicketWorld = "world" + TicketX = "x" + TicketY = "Y" + TicketZ = "Z" + TicketDate = "date" + TicketLink = Link +) diff --git a/model/django/ticketnote.go b/model/django/ticketnote.go new file mode 100644 index 0000000..65c62a9 --- /dev/null +++ b/model/django/ticketnote.go @@ -0,0 +1,11 @@ +package django + +const ( + TicketNoteID = ID + TicketNoteAuthorID = "author_id" + TicketNoteTicketID = "ticket_id" + TicketNoteMessage = "message" + TicketNoteLastUpdate = "last_update" + TicketNoteDate = "date" + TicketNoteLink = Link +) diff --git a/model/django/usersettings.go b/model/django/usersettings.go new file mode 100644 index 0000000..c9d3fa7 --- /dev/null +++ b/model/django/usersettings.go @@ -0,0 +1,13 @@ +package django + +const ( + UserSettingsID = ID + UserSettingsAuthUserID = "auth_user_id" + UserSettingsDefaultResults = "default_results" + UserSettingsDefaultTheme = "default_theme" + UserSettingsDefaultTimezone = "default_timezone" + UserSettingsSearchPlayerIP = "search_player_ip" + UserSettingsShowTimestampChat = "show_timestamp_chat" + UserSettingsLastIP = "last_ip" + UserSettingsLink = Link +) diff --git a/model/ip.go b/model/ip.go new file mode 100644 index 0000000..8f2c992 --- /dev/null +++ b/model/ip.go @@ -0,0 +1,30 @@ +package model + +import ( + "encoding/json" + "go.etztech.xyz/go-mcm/model/django" +) + +type IP struct { + ID int64 `json:"id"` + PlayerID int64 `json:"player_id"` + LastUsed string `json:"last_used"` + Link string `json:"link"` +} + +func (q *Query) IP(builder *django.Builder) ([]*IP, error) { + endpoint := q.endpoint("ip", builder.QueryString()) + ips := make([]*IP, 0) + + resp, err := response(endpoint) + if err != nil { + return nil, err + } + + err = json.Unmarshal(resp, &ips) + if err != nil { + return nil, err + } + + return ips, nil +} diff --git a/model/model.go b/model/model.go new file mode 100644 index 0000000..f5112d7 --- /dev/null +++ b/model/model.go @@ -0,0 +1,47 @@ +package model + +import ( + "fmt" + "go.etztech.xyz/go-mcm/model/django" + "io/ioutil" + "net/http" + "strings" +) + +type Query struct { + Token string + URL string +} + +func NewQuery(token, baseURL string) *Query { + return &Query{ + Token: token, + URL: fmt.Sprintf("%s/model", strings.TrimRight(baseURL, "/")), + } +} + +func (q *Query) NewDjangoBuilder() *django.Builder { + return django.NewBuilder(q.Token) +} + +func (q *Query) endpoint(model, query string) string { + if !strings.HasPrefix(query, "?") { + query = "?" + query + } + return fmt.Sprintf("%s/%s%s", q.URL, model, query) +} + +func response(endpoint string) ([]byte, error) { + resp, err := http.Get(endpoint) + if err != nil { + return nil, err + } + defer resp.Body.Close() + + body, err := ioutil.ReadAll(resp.Body) + if err != nil { + return nil, err + } + + return body, err +} diff --git a/model/note.go b/model/note.go new file mode 100644 index 0000000..0b6e2c9 --- /dev/null +++ b/model/note.go @@ -0,0 +1,41 @@ +package model + +import ( + "encoding/json" + "go.etztech.xyz/go-mcm/model/django" +) + +type Importance string + +const ( + ImportanceLow Importance = "L" + ImportanceMedium Importance = "M" + ImportanceHigh Importance = "H" +) + +type Note struct { + ID int64 `json:"id"` + PlayerID int64 `json:"player_id"` + Message string `json:"message"` + Importance Importance `json:"importance"` + StaffID int64 `json:"staff_id"` + Date string `json:"date"` + Link string `json:"link"` +} + +func (q *Query) Note(builder *django.Builder) ([]*Note, error) { + endpoint := q.endpoint("note", builder.QueryString()) + notes := make([]*Note, 0) + + resp, err := response(endpoint) + if err != nil { + return nil, err + } + + err = json.Unmarshal(resp, ¬es) + if err != nil { + return nil, err + } + + return notes, nil +} diff --git a/model/player.go b/model/player.go new file mode 100644 index 0000000..4297c9d --- /dev/null +++ b/model/player.go @@ -0,0 +1,34 @@ +package model + +import ( + "encoding/json" + "go.etztech.xyz/go-mcm/model/django" +) + +type Player struct { + ID int64 `json:"id"` + AuthUserID int64 `json:"auth_user_id"` + UUID string `json:"uuid"` + Username string `json:"username"` + ApplicationID int64 `json:"application_id"` + FirstSeen string `json:"first_seen"` + LastSeen string `json:"last_seen"` + Link string `json:"link"` +} + +func (q *Query) Player(builder *django.Builder) ([]*Player, error) { + endpoint := q.endpoint("player", builder.QueryString()) + players := make([]*Player, 0) + + resp, err := response(endpoint) + if err != nil { + return nil, err + } + + err = json.Unmarshal(resp, &players) + if err != nil { + return nil, err + } + + return players, nil +} diff --git a/model/ticket.go b/model/ticket.go new file mode 100644 index 0000000..af95285 --- /dev/null +++ b/model/ticket.go @@ -0,0 +1,54 @@ +package model + +import ( + "encoding/json" + "go.etztech.xyz/go-mcm/model/django" +) + +type Priority string + +const ( + PriorityLow Priority = "L" + PriorityMedium Priority = "M" + PriorityHigh Priority = "H" +) + +type World string + +const ( + WorldOverworld World = "O" + WorldNether World = "N" + WorldTheEnd World = "E" +) + +type Ticket struct { + ID int64 `json:"id"` + PlayerID int64 `json:"player_id"` + Message string `json:"message"` + Priority Priority `json:"priority"` + StaffID int64 `json:"staff_id"` + Resolved bool `json:"resolved"` + World World `json:"world"` + X string `json:"x"` + Y string `json:"Y"` + Z string `json:"Z"` + Date string `json:"date"` + Link string `json:"link"` +} + +func (q *Query) Ticket(builder *django.Builder) ([]*Ticket, error) { + endpoint := q.endpoint("ticket", builder.QueryString()) + tickets := make([]*Ticket, 0) + + resp, err := response(endpoint) + if err != nil { + return nil, err + } + + err = json.Unmarshal(resp, &tickets) + if err != nil { + return nil, err + } + + return tickets, nil +} diff --git a/model/ticketnote.go b/model/ticketnote.go new file mode 100644 index 0000000..c67ad10 --- /dev/null +++ b/model/ticketnote.go @@ -0,0 +1,33 @@ +package model + +import ( + "encoding/json" + "go.etztech.xyz/go-mcm/model/django" +) + +type TicketNote struct { + ID int64 `json:"id"` + AuthorID int64 `json:"author_id"` + TicketID int64 `json:"ticket_id"` + Message string `json:"message"` + LastUpdate string `json:"last_update"` + Date string `json:"date"` + Link string `json:"link"` +} + +func (q *Query) TicketNote(builder *django.Builder) ([]*TicketNote, error) { + endpoint := q.endpoint("ticketnote", builder.QueryString()) + ticketNotes := make([]*TicketNote, 0) + + resp, err := response(endpoint) + if err != nil { + return nil, err + } + + err = json.Unmarshal(resp, &ticketNotes) + if err != nil { + return nil, err + } + + return ticketNotes, nil +} diff --git a/model/usersettings.go b/model/usersettings.go new file mode 100644 index 0000000..64939f5 --- /dev/null +++ b/model/usersettings.go @@ -0,0 +1,54 @@ +package model + +import ( + "encoding/json" + "go.etztech.xyz/go-mcm/model/django" +) + +type Results int64 + +const ( + Results10 Results = 10 + Results25 Results = 25 + Results50 Results = 50 + Results100 Results = 100 + ResultsAll Results = -1 +) + +type Theme string + +const ( + ThemesDefault Theme = "DE" + ThemesDark Theme = "DA" + ThemesSolar Theme = "SO" + ThemesSlate Theme = "SL" +) + +type UserSettings struct { + ID int64 `json:"id"` + AuthUserID int64 `json:"auth_user_id"` + DefaultResults Results `json:"default_results"` + DefaultTheme Theme `json:"default_theme"` + DefaultTimezone string `json:"default_timezone"` + SearchPlayerIP bool `json:"search_player_ip"` + ShowTimestampChat bool `json:"show_timestamp_chat"` + LastIP string `json:"last_ip"` + Link string `json:"link"` +} + +func (q *Query) UserSettings(builder *django.Builder) ([]*UserSettings, error) { + endpoint := q.endpoint("usersettings", builder.QueryString()) + userSettingss := make([]*UserSettings, 0) + + resp, err := response(endpoint) + if err != nil { + return nil, err + } + + err = json.Unmarshal(resp, &userSettingss) + if err != nil { + return nil, err + } + + return userSettingss, nil +}