Skip to content
This repository was archived by the owner on May 15, 2021. It is now read-only.

Commit aed89f1

Browse files
author
Seraphim R.P
committed
Implement +version list.
1 parent aff8071 commit aed89f1

File tree

5 files changed

+97
-44
lines changed

5 files changed

+97
-44
lines changed

i18n/languages.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ import (
1010
//go:embed english/english.json
1111
var englishRawObjectFile []byte
1212

13-
// ImportLanguages imports the old JSON database into the new PGSQL one.
13+
// ImportLanguages simply imports any defined languages and returns them in a map.
1414
func ImportLanguages() map[string]models.Language {
1515
languages := make(map[string]models.Language)
1616

models/language.go

Lines changed: 35 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -2,15 +2,12 @@ package models
22

33
import (
44
"reflect"
5+
"regexp"
56
"strings"
6-
7-
"gorm.io/gorm"
8-
"internal.kerygma.digital/kerygma-digital/biblebot/backend/utils/slices"
97
)
108

119
// Language is a type describing an interface language.
1210
type Language struct {
13-
gorm.Model
1411
Name string
1512
RawName string
1613
RawObject RawLanguage
@@ -209,45 +206,45 @@ type args struct {
209206
False string `json:"false"`
210207
}
211208

212-
func (lng Language) GetString(ctx *Context, str string, params []string) string {
213-
// TODO: Infer params from raw string, as they are always surrounded by <>. Making it a parameter is mildly inconvenient.
214-
rawStr := lng.GetRawString(str)
209+
func (lng Language) GetString(ctx *Context, str string) string {
210+
return lng.TranslatePlaceholdersInString(ctx, lng.GetRawString(str))
211+
}
215212

216-
if params == nil {
217-
return rawStr
213+
func (lng Language) GetRawString(str string) string {
214+
v := reflect.ValueOf(lng.RawObject)
215+
216+
for i := 0; i < v.NumField(); i++ {
217+
if v.Type().Field(i).Name == str && !stringInSlice(str, []string{"Commands", "Arguments"}) {
218+
return v.Field(i).String()
219+
}
218220
}
219221

220-
for _, replaceQuery := range params {
221-
origQuery := replaceQuery
222+
return str
223+
}
224+
225+
func (lng Language) TranslatePlaceholdersInString(ctx *Context, str string) string {
226+
placeholderRegex, _ := regexp.Compile("<([^<>]+)>")
227+
placeholders := placeholderRegex.FindAllString(str, -1)
228+
229+
for _, placeholder := range placeholders {
230+
tmpPlaceholder := placeholder
222231

223-
switch replaceQuery {
232+
switch placeholder {
224233
case "<+>":
225-
replaceQuery = ctx.GuildPrefs.Prefix
234+
placeholder = ctx.GuildPrefs.Prefix
226235
default:
227-
purifiedQuery := strings.Title(replaceQuery[1 : len(replaceQuery)-1])
236+
purifiedQuery := strings.Title(placeholder[1 : len(placeholder)-1])
228237
possibleCommand := lng.GetCommandTranslation(purifiedQuery)
229238
possibleArgument := lng.GetArgumentTranslation(purifiedQuery)
230239

231240
if possibleCommand != purifiedQuery {
232-
replaceQuery = possibleCommand
241+
placeholder = possibleCommand
233242
} else if possibleArgument != purifiedQuery {
234-
replaceQuery = possibleArgument
243+
placeholder = possibleArgument
235244
}
236245
}
237246

238-
rawStr = strings.ReplaceAll(rawStr, origQuery, replaceQuery)
239-
}
240-
241-
return rawStr
242-
}
243-
244-
func (lng Language) GetRawString(str string) string {
245-
v := reflect.ValueOf(lng.RawObject)
246-
247-
for i := 0; i < v.NumField(); i++ {
248-
if v.Type().Field(i).Name == str && !slices.StringInSlice(str, []string{"Commands", "Arguments"}) {
249-
return v.Field(i).String()
250-
}
247+
str = strings.ReplaceAll(str, tmpPlaceholder, placeholder)
251248
}
252249

253250
return str
@@ -300,3 +297,12 @@ func (lng Language) GetArgumentTranslation(str string) string {
300297

301298
return str
302299
}
300+
301+
func stringInSlice(a string, list []string) bool {
302+
for _, b := range list {
303+
if b == a {
304+
return true
305+
}
306+
}
307+
return false
308+
}

models/response.go

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,10 @@ package models
22

33
// CommandResponse is a model for command output.
44
type CommandResponse struct {
5-
OK bool `json:"ok"`
6-
Content *DiscordEmbed `json:"content"`
7-
Pages []*DiscordEmbed `json:"pages"`
5+
OK bool `json:"ok"`
6+
Language *Language `json:"language"`
7+
Content *DiscordEmbed `json:"content"`
8+
Pages []*DiscordEmbed `json:"pages"`
89
}
910

1011
// VerseResponse is a model for command output.

routes/commands/settings/versions.go

Lines changed: 45 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,10 @@ package settings
22

33
import (
44
"fmt"
5+
"math"
56
"sort"
7+
"strconv"
8+
"strings"
69
"sync"
710

811
"internal.kerygma.digital/kerygma-digital/biblebot/backend/models"
@@ -27,7 +30,7 @@ func NewVersionCommandRouter() *VersionCommandRouter {
2730
versionOnce.Do(func() {
2831
versionInstance = &VersionCommandRouter{
2932
DefaultCommand: verDefault,
30-
Commands: []models.Command{verSet, verSetServer},
33+
Commands: []models.Command{verSet, verSetServer, verList},
3134
}
3235
})
3336

@@ -86,6 +89,8 @@ var verDefault = models.Command{
8689
var verSet = models.Command{
8790
Command: "set",
8891
Process: func(params []string, ctx *models.Context) *models.CommandResponse {
92+
lng := ctx.Language
93+
8994
var idealVersion models.Version
9095
var idealUser models.UserPreference
9196

@@ -106,10 +111,10 @@ var verSet = models.Command{
106111
}
107112

108113
response.OK = true
109-
response.Content = embedify.Embedify("", "+version set", ctx.Language.GetString(ctx, "SetVersionSuccess", nil), false, "")
114+
response.Content = embedify.Embedify("", lng.TranslatePlaceholdersInString(ctx, "<+><version> <set>"), lng.GetString(ctx, "SetVersionSuccess"), false, "")
110115
} else {
111116
response.OK = false
112-
response.Content = embedify.Embedify("", "+version set", ctx.Language.GetString(ctx, "SetVersionFail", []string{"<+>", "<version>", "<list>"}), false, "")
117+
response.Content = embedify.Embedify("", lng.TranslatePlaceholdersInString(ctx, "<+><version> <set>"), lng.GetString(ctx, "SetVersionFail"), false, "")
113118
}
114119

115120
return &response
@@ -119,6 +124,8 @@ var verSet = models.Command{
119124
var verSetServer = models.Command{
120125
Command: "setserver",
121126
Process: func(params []string, ctx *models.Context) *models.CommandResponse {
127+
lng := ctx.Language
128+
122129
var idealVersion models.Version
123130
var idealGuild models.GuildPreference
124131

@@ -139,10 +146,10 @@ var verSetServer = models.Command{
139146
}
140147

141148
response.OK = true
142-
response.Content = embedify.Embedify("", "+version setserver", ctx.Language.GetString(ctx, "SetGuildVersionSuccess", nil), false, "")
149+
response.Content = embedify.Embedify("", lng.TranslatePlaceholdersInString(ctx, "<+><version> <setserver>"), lng.GetString(ctx, "SetGuildVersionSuccess"), false, "")
143150
} else {
144151
response.OK = false
145-
response.Content = embedify.Embedify("", "+version setserver", ctx.Language.GetString(ctx, "SetGuildVersionFail", []string{"<+>", "<version>", "<list>"}), false, "")
152+
response.Content = embedify.Embedify("", lng.TranslatePlaceholdersInString(ctx, "<+><version> <setserver>"), lng.GetString(ctx, "SetGuildVersionFail"), false, "")
146153
}
147154

148155
return &response
@@ -160,19 +167,46 @@ var verList = models.Command{
160167
return versions[i].Name < versions[j].Name
161168
})
162169

163-
/*var pages []string
170+
var pages []*models.DiscordEmbed
164171
var maxResultsPerPage = 25
165172
var versionsUsed []models.Version
166-
totalPages := math.Ceil(len(versions) / maxResultsPerPage)
173+
totalPages := int(math.Ceil(float64(len(versions)) / float64(maxResultsPerPage)))
167174

168175
if totalPages == 0 {
169176
totalPages = 1
170177
}
171178

172-
for i := range totalPages {
173-
// TODO, finish this once languages are implemented
174-
}*/
179+
for i := 0; i < totalPages; i++ {
180+
pageCounter := ctx.Language.GetString(ctx, "PageOf")
181+
pageCounter = strings.ReplaceAll(pageCounter, "<num>", strconv.Itoa(i+1))
182+
pageCounter = strings.ReplaceAll(pageCounter, "<total>", strconv.Itoa(totalPages))
183+
184+
title := fmt.Sprintf("%s - %s", ctx.Language.TranslatePlaceholdersInString(ctx, "<+><version> <list>"), pageCounter)
185+
embed := embedify.Embedify("", title, "", false, "")
175186

176-
return &models.CommandResponse{}
187+
count := 0
188+
versionList := ""
189+
190+
for _, version := range versions {
191+
if count < maxResultsPerPage {
192+
if !slices.VersionInSlice(version, versionsUsed) {
193+
versionList += fmt.Sprintf("%s\n", version.Name)
194+
195+
versionsUsed = append(versionsUsed, version)
196+
versions = versions[1:]
197+
count++
198+
}
199+
}
200+
}
201+
202+
embed.Description = versionList
203+
pages = append(pages, embed)
204+
}
205+
206+
return &models.CommandResponse{
207+
OK: true,
208+
Language: &ctx.Language,
209+
Pages: pages,
210+
}
177211
},
178212
}

utils/slices/slices.go

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@ package slices
22

33
import (
44
"reflect"
5+
6+
"internal.kerygma.digital/kerygma-digital/biblebot/backend/models"
57
)
68

79
// Index finds index of string in []string, otherwise returns -1
@@ -53,6 +55,16 @@ func IntInSlice(a int, list []int) bool {
5355
return false
5456
}
5557

58+
// VersionInSlice returns whether a is in list.
59+
func VersionInSlice(a models.Version, list []models.Version) bool {
60+
for _, b := range list {
61+
if b == a {
62+
return true
63+
}
64+
}
65+
return false
66+
}
67+
5668
// IndexRune finds index of rune in []rune, otherwise returns -1
5769
func IndexRune(vs []rune, t rune) int {
5870
for i, v := range vs {

0 commit comments

Comments
 (0)