Separate button labels
This commit is contained in:
parent
0ba71b9361
commit
d54dbe10f5
@ -66,7 +66,7 @@ func (d *multiPanelMessageData) send(ctx *botcontext.BotContext, panels []databa
|
|||||||
}
|
}
|
||||||
|
|
||||||
options[i] = component.SelectOption{
|
options[i] = component.SelectOption{
|
||||||
Label: panel.Title,
|
Label: panel.ButtonLabel,
|
||||||
Value: panel.CustomId,
|
Value: panel.CustomId,
|
||||||
Emoji: emote,
|
Emoji: emote,
|
||||||
}
|
}
|
||||||
@ -96,7 +96,7 @@ func (d *multiPanelMessageData) send(ctx *botcontext.BotContext, panels []databa
|
|||||||
}
|
}
|
||||||
|
|
||||||
buttons[i] = component.BuildButton(component.Button{
|
buttons[i] = component.BuildButton(component.Button{
|
||||||
Label: panel.Title,
|
Label: panel.ButtonLabel,
|
||||||
CustomId: panel.CustomId,
|
CustomId: panel.CustomId,
|
||||||
Style: component.ButtonStyle(panel.ButtonStyle),
|
Style: component.ButtonStyle(panel.ButtonStyle),
|
||||||
Emoji: buttonEmoji,
|
Emoji: buttonEmoji,
|
||||||
|
@ -36,6 +36,7 @@ type panelBody struct {
|
|||||||
ImageUrl *string `json:"image_url,omitempty"`
|
ImageUrl *string `json:"image_url,omitempty"`
|
||||||
ThumbnailUrl *string `json:"thumbnail_url,omitempty"`
|
ThumbnailUrl *string `json:"thumbnail_url,omitempty"`
|
||||||
ButtonStyle component.ButtonStyle `json:"button_style,string"`
|
ButtonStyle component.ButtonStyle `json:"button_style,string"`
|
||||||
|
ButtonLabel string `json:"button_label"`
|
||||||
FormId *int `json:"form_id"`
|
FormId *int `json:"form_id"`
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -55,6 +56,7 @@ func (p *panelBody) IntoPanelMessageData(customId string, isPremium bool) panelM
|
|||||||
ThumbnailUrl: p.ThumbnailUrl,
|
ThumbnailUrl: p.ThumbnailUrl,
|
||||||
Emoji: emoji,
|
Emoji: emoji,
|
||||||
ButtonStyle: p.ButtonStyle,
|
ButtonStyle: p.ButtonStyle,
|
||||||
|
ButtonLabel: p.ButtonLabel,
|
||||||
IsPremium: isPremium,
|
IsPremium: isPremium,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -100,10 +102,7 @@ func CreatePanel(ctx *gin.Context) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if len(panels) >= freePanelLimit {
|
if len(panels) >= freePanelLimit {
|
||||||
ctx.AbortWithStatusJSON(402, gin.H{
|
ctx.AbortWithStatusJSON(402, utils.ErrorStr("You have exceeded your panel quota. Purchase premium to unlock more panels."))
|
||||||
"success": false,
|
|
||||||
"error": "You have exceeded your panel quota. Purchase premium to unlock more panels.",
|
|
||||||
})
|
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -150,6 +149,7 @@ func CreatePanel(ctx *gin.Context) {
|
|||||||
ImageUrl: data.ImageUrl,
|
ImageUrl: data.ImageUrl,
|
||||||
ThumbnailUrl: data.ThumbnailUrl,
|
ThumbnailUrl: data.ThumbnailUrl,
|
||||||
ButtonStyle: int(data.ButtonStyle),
|
ButtonStyle: int(data.ButtonStyle),
|
||||||
|
ButtonLabel: data.ButtonLabel,
|
||||||
FormId: data.FormId,
|
FormId: data.FormId,
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -279,6 +279,11 @@ func (p *panelBody) doValidations(ctx *gin.Context, guildId uint64) bool {
|
|||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if !p.verifyButtonLabel() {
|
||||||
|
ctx.AbortWithStatusJSON(400, utils.ErrorStr("Button labels cannot be longer than 80 characters"))
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
valid, err := p.verifyTeams(guildId)
|
valid, err := p.verifyTeams(guildId)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@ -384,6 +389,14 @@ func (p *panelBody) verifyButtonStyle() bool {
|
|||||||
return p.ButtonStyle >= component.ButtonStylePrimary && p.ButtonStyle <= component.ButtonStyleDanger
|
return p.ButtonStyle >= component.ButtonStylePrimary && p.ButtonStyle <= component.ButtonStyleDanger
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (p *panelBody) verifyButtonLabel() bool {
|
||||||
|
if len(p.ButtonLabel) == 0 {
|
||||||
|
p.ButtonLabel = p.Title // Title already checked for 80 char max
|
||||||
|
}
|
||||||
|
|
||||||
|
return len(p.ButtonLabel) <= 80
|
||||||
|
}
|
||||||
|
|
||||||
func (p *panelBody) verifyFormId(guildId uint64) (bool, error) {
|
func (p *panelBody) verifyFormId(guildId uint64) (bool, error) {
|
||||||
if p.FormId == nil {
|
if p.FormId == nil {
|
||||||
return true, nil
|
return true, nil
|
||||||
|
@ -16,6 +16,7 @@ type panelMessageData struct {
|
|||||||
Colour int
|
Colour int
|
||||||
ImageUrl, ThumbnailUrl, Emoji *string
|
ImageUrl, ThumbnailUrl, Emoji *string
|
||||||
ButtonStyle component.ButtonStyle
|
ButtonStyle component.ButtonStyle
|
||||||
|
ButtonLabel string
|
||||||
IsPremium bool
|
IsPremium bool
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -35,6 +36,7 @@ func panelIntoMessageData(panel database.Panel, isPremium bool) panelMessageData
|
|||||||
ThumbnailUrl: panel.ThumbnailUrl,
|
ThumbnailUrl: panel.ThumbnailUrl,
|
||||||
Emoji: emoji,
|
Emoji: emoji,
|
||||||
ButtonStyle: component.ButtonStyle(panel.ButtonStyle),
|
ButtonStyle: component.ButtonStyle(panel.ButtonStyle),
|
||||||
|
ButtonLabel: panel.ButtonLabel,
|
||||||
IsPremium: isPremium,
|
IsPremium: isPremium,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -68,7 +70,7 @@ func (p *panelMessageData) send(ctx *botcontext.BotContext) (uint64, error) {
|
|||||||
Embeds: []*embed.Embed{e},
|
Embeds: []*embed.Embed{e},
|
||||||
Components: []component.Component{
|
Components: []component.Component{
|
||||||
component.BuildActionRow(component.BuildButton(component.Button{
|
component.BuildActionRow(component.BuildButton(component.Button{
|
||||||
Label: p.Title,
|
Label: p.ButtonLabel,
|
||||||
CustomId: p.CustomId,
|
CustomId: p.CustomId,
|
||||||
Style: p.ButtonStyle,
|
Style: p.ButtonStyle,
|
||||||
Emoji: buttonEmoji,
|
Emoji: buttonEmoji,
|
||||||
|
@ -20,35 +20,32 @@ func UpdatePanel(ctx *gin.Context) {
|
|||||||
|
|
||||||
botContext, err := botcontext.ContextForGuild(guildId)
|
botContext, err := botcontext.ContextForGuild(guildId)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
ctx.AbortWithStatusJSON(500, utils.ErrorJson(err))
|
ctx.JSON(500, utils.ErrorJson(err))
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
var data panelBody
|
var data panelBody
|
||||||
if err := ctx.BindJSON(&data); err != nil {
|
if err := ctx.BindJSON(&data); err != nil {
|
||||||
ctx.AbortWithStatusJSON(400, utils.ErrorJson(err))
|
ctx.JSON(400, utils.ErrorJson(err))
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
panelId, err := strconv.Atoi(ctx.Param("panelid"))
|
panelId, err := strconv.Atoi(ctx.Param("panelid"))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
ctx.AbortWithStatusJSON(400, utils.ErrorJson(err))
|
ctx.JSON(400, utils.ErrorJson(err))
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
// get existing
|
// get existing
|
||||||
existing, err := dbclient.Client.Panel.GetById(panelId)
|
existing, err := dbclient.Client.Panel.GetById(panelId)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
ctx.AbortWithStatusJSON(500, utils.ErrorJson(err))
|
ctx.JSON(500, utils.ErrorJson(err))
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
// check guild ID matches
|
// check guild ID matches
|
||||||
if existing.GuildId != guildId {
|
if existing.GuildId != guildId {
|
||||||
ctx.AbortWithStatusJSON(400, gin.H{
|
ctx.JSON(400, utils.ErrorStr("Guild ID does not match"))
|
||||||
"success": false,
|
|
||||||
"error": "Guild ID does not match",
|
|
||||||
})
|
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -109,7 +106,8 @@ func UpdatePanel(ctx *gin.Context) {
|
|||||||
existing.ReactionEmote != data.Emote ||
|
existing.ReactionEmote != data.Emote ||
|
||||||
existing.ImageUrl != data.ImageUrl ||
|
existing.ImageUrl != data.ImageUrl ||
|
||||||
existing.ThumbnailUrl != data.ThumbnailUrl ||
|
existing.ThumbnailUrl != data.ThumbnailUrl ||
|
||||||
component.ButtonStyle(existing.ButtonStyle) != data.ButtonStyle
|
component.ButtonStyle(existing.ButtonStyle) != data.ButtonStyle ||
|
||||||
|
existing.ButtonLabel != data.ButtonLabel
|
||||||
|
|
||||||
emoji, _ := data.getEmoji() // already validated
|
emoji, _ := data.getEmoji() // already validated
|
||||||
newMessageId := existing.MessageId
|
newMessageId := existing.MessageId
|
||||||
@ -123,13 +121,10 @@ func UpdatePanel(ctx *gin.Context) {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
var unwrapped request.RestError
|
var unwrapped request.RestError
|
||||||
if errors.As(err, &unwrapped) && unwrapped.StatusCode == 403 {
|
if errors.As(err, &unwrapped) && unwrapped.StatusCode == 403 {
|
||||||
ctx.AbortWithStatusJSON(500, gin.H{
|
ctx.JSON(500, utils.ErrorStr("I do not have permission to send messages in the specified channel"))
|
||||||
"success": false,
|
|
||||||
"error": "I do not have permission to send messages in the specified channel",
|
|
||||||
})
|
|
||||||
} else {
|
} else {
|
||||||
// TODO: Most appropriate error?
|
// TODO: Most appropriate error?
|
||||||
ctx.AbortWithStatusJSON(500, utils.ErrorJson(err))
|
ctx.JSON(500, utils.ErrorJson(err))
|
||||||
}
|
}
|
||||||
|
|
||||||
return
|
return
|
||||||
|
@ -4,7 +4,7 @@
|
|||||||
<Input label="Panel Title" placeholder="Open a ticket!" col1=true bind:value={data.title}/>
|
<Input label="Panel Title" placeholder="Open a ticket!" col1=true bind:value={data.title}/>
|
||||||
</div>
|
</div>
|
||||||
<div class="col-2-3">
|
<div class="col-2-3">
|
||||||
<Textarea col1=true label="Panel Content" placeholder="By clicking the button, a ticket will be opened for you."
|
<Textarea col1=true label="Panel Content" placeholder="By clicking the button, a ticket will be opened for you."
|
||||||
bind:value={data.content}/>
|
bind:value={data.content}/>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@ -15,14 +15,16 @@
|
|||||||
<EmojiInput label="Button Emoji" col4=true bind:value={data.emote}/>
|
<EmojiInput label="Button Emoji" col4=true bind:value={data.emote}/>
|
||||||
</div>
|
</div>
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<Dropdown col4=true label="Button Style" bind:value={data.button_style}>
|
<Dropdown col3=true label="Button Style" bind:value={data.button_style}>
|
||||||
<option value="1">Blue</option>
|
<option value="1">Blue</option>
|
||||||
<option value="2">Grey</option>
|
<option value="2">Grey</option>
|
||||||
<option value="3">Green</option>
|
<option value="3">Green</option>
|
||||||
<option value="4">Red</option>
|
<option value="4">Red</option>
|
||||||
</Dropdown>
|
</Dropdown>
|
||||||
|
|
||||||
<Dropdown col4=true label="Form" bind:value={data.form_id}>
|
<Input col3={true} label="Button Text" placeholder="Open a ticket!" bind:value={data.button_label} />
|
||||||
|
|
||||||
|
<Dropdown col3=true label="Form" bind:value={data.form_id}>
|
||||||
<option value=null>None</option>
|
<option value=null>None</option>
|
||||||
{#each forms as form}
|
{#each forms as form}
|
||||||
<option value={form.form_id}>{form.title}</option>
|
<option value={form.form_id}>{form.title}</option>
|
||||||
|
2
go.mod
2
go.mod
@ -6,7 +6,7 @@ require (
|
|||||||
github.com/BurntSushi/toml v0.3.1
|
github.com/BurntSushi/toml v0.3.1
|
||||||
github.com/TicketsBot/archiverclient v0.0.0-20220326163414-558fd52746dc
|
github.com/TicketsBot/archiverclient v0.0.0-20220326163414-558fd52746dc
|
||||||
github.com/TicketsBot/common v0.0.0-20220609182514-8d43f86e8253
|
github.com/TicketsBot/common v0.0.0-20220609182514-8d43f86e8253
|
||||||
github.com/TicketsBot/database v0.0.0-20220615120431-32ea29720357
|
github.com/TicketsBot/database v0.0.0-20220616133502-42690a5719dd
|
||||||
github.com/TicketsBot/logarchiver v0.0.0-20220326162808-cdf0310f5e1c
|
github.com/TicketsBot/logarchiver v0.0.0-20220326162808-cdf0310f5e1c
|
||||||
github.com/TicketsBot/worker v0.0.0-20220614162334-f81bf3f39aa5
|
github.com/TicketsBot/worker v0.0.0-20220614162334-f81bf3f39aa5
|
||||||
github.com/apex/log v1.1.2
|
github.com/apex/log v1.1.2
|
||||||
|
4
go.sum
4
go.sum
@ -5,8 +5,8 @@ github.com/TicketsBot/archiverclient v0.0.0-20220326163414-558fd52746dc h1:n15W8
|
|||||||
github.com/TicketsBot/archiverclient v0.0.0-20220326163414-558fd52746dc/go.mod h1:2KcfHS0JnSsgcxZBs3NyWMXNQzEo67mBSGOyzHPWOCc=
|
github.com/TicketsBot/archiverclient v0.0.0-20220326163414-558fd52746dc/go.mod h1:2KcfHS0JnSsgcxZBs3NyWMXNQzEo67mBSGOyzHPWOCc=
|
||||||
github.com/TicketsBot/common v0.0.0-20220609182514-8d43f86e8253 h1:HbL0OBZHmU0TbB/lAQ9RY0TqxhAKRO8JNh2XUe0NH8c=
|
github.com/TicketsBot/common v0.0.0-20220609182514-8d43f86e8253 h1:HbL0OBZHmU0TbB/lAQ9RY0TqxhAKRO8JNh2XUe0NH8c=
|
||||||
github.com/TicketsBot/common v0.0.0-20220609182514-8d43f86e8253/go.mod h1:ZAoYcDD7SQLTsZT7dbo/X0J256+pogVRAReunCGng+U=
|
github.com/TicketsBot/common v0.0.0-20220609182514-8d43f86e8253/go.mod h1:ZAoYcDD7SQLTsZT7dbo/X0J256+pogVRAReunCGng+U=
|
||||||
github.com/TicketsBot/database v0.0.0-20220615120431-32ea29720357 h1:gTpRYmI/Oq87tHHmeIpT5UYOS5PuLxj2teP5Jb7RvdY=
|
github.com/TicketsBot/database v0.0.0-20220616133502-42690a5719dd h1:tcPXP5Jd/K3/lavUyZYZDCFRNrPCtbgh6JlVTi9nIzQ=
|
||||||
github.com/TicketsBot/database v0.0.0-20220615120431-32ea29720357/go.mod h1:F57cywrZsnper1cy56Bx0c/HEsxQBLHz3Pl98WXblWw=
|
github.com/TicketsBot/database v0.0.0-20220616133502-42690a5719dd/go.mod h1:F57cywrZsnper1cy56Bx0c/HEsxQBLHz3Pl98WXblWw=
|
||||||
github.com/TicketsBot/logarchiver v0.0.0-20220326162808-cdf0310f5e1c h1:OqGjFH6mbE6gd+NqI2ARJdtH3UUvhiAkD0r0fhGJK2s=
|
github.com/TicketsBot/logarchiver v0.0.0-20220326162808-cdf0310f5e1c h1:OqGjFH6mbE6gd+NqI2ARJdtH3UUvhiAkD0r0fhGJK2s=
|
||||||
github.com/TicketsBot/logarchiver v0.0.0-20220326162808-cdf0310f5e1c/go.mod h1:jgi2OXQKsd5nUnTIRkwvPmeuD/i7OhN68LKMssuQY1c=
|
github.com/TicketsBot/logarchiver v0.0.0-20220326162808-cdf0310f5e1c/go.mod h1:jgi2OXQKsd5nUnTIRkwvPmeuD/i7OhN68LKMssuQY1c=
|
||||||
github.com/TicketsBot/ttlcache v1.6.1-0.20200405150101-acc18e37b261 h1:NHD5GB6cjlkpZFjC76Yli2S63/J2nhr8MuE6KlYJpQM=
|
github.com/TicketsBot/ttlcache v1.6.1-0.20200405150101-acc18e37b261 h1:NHD5GB6cjlkpZFjC76Yli2S63/J2nhr8MuE6KlYJpQM=
|
||||||
|
Loading…
x
Reference in New Issue
Block a user