Different activity types

This commit is contained in:
rxdn 2022-06-21 19:26:54 +01:00
parent b0feeb15c9
commit 49ce52283c
17 changed files with 220 additions and 246 deletions

View File

@ -4,6 +4,7 @@ import (
"context"
"github.com/TicketsBot/GoPanel/database"
"github.com/TicketsBot/GoPanel/rpc/cache"
"github.com/TicketsBot/GoPanel/utils"
"github.com/gin-gonic/gin"
"github.com/rxdn/gdl/objects/user"
"golang.org/x/sync/errgroup"
@ -21,10 +22,7 @@ func GetBlacklistHandler(ctx *gin.Context) {
blacklistedUsers, err := database.Client.Blacklist.GetBlacklistedUsers(guildId)
if err != nil {
ctx.JSON(500, gin.H{
"success": false,
"error": err.Error(),
})
ctx.JSON(500, utils.ErrorJson(err))
return
}

View File

@ -26,10 +26,7 @@ func GetGuilds(ctx *gin.Context) {
guilds, err := database.Client.UserGuilds.Get(userId)
if err != nil {
ctx.JSON(500, gin.H{
"success": false,
"error": err.Error(),
})
ctx.JSON(500, utils.ErrorJson(err))
return
}

View File

@ -1,7 +1,6 @@
package api
import (
"fmt"
"github.com/TicketsBot/GoPanel/botcontext"
"github.com/TicketsBot/GoPanel/database"
"github.com/TicketsBot/GoPanel/rpc"
@ -42,7 +41,6 @@ func DeletePanel(ctx *gin.Context) {
// Get any multi panels this panel is part of to use later
multiPanels, err := database.Client.MultiPanelTargets.GetMultiPanels(panelId)
if err != nil {
fmt.Println(err.Error())
ctx.JSON(500, utils.ErrorJson(err))
return
}

View File

@ -3,6 +3,7 @@ package api
import (
"context"
dbclient "github.com/TicketsBot/GoPanel/database"
"github.com/TicketsBot/GoPanel/utils"
"github.com/TicketsBot/GoPanel/utils/types"
"github.com/TicketsBot/database"
"github.com/gin-gonic/gin"
@ -88,10 +89,7 @@ func ListPanels(ctx *gin.Context) {
}
if err := group.Wait(); err != nil {
ctx.JSON(500, gin.H{
"success": false,
"error": err.Error(),
})
ctx.JSON(500, utils.ErrorJson(err))
return
}

View File

@ -3,6 +3,7 @@ package api
import (
"context"
"github.com/TicketsBot/GoPanel/rpc/cache"
"github.com/TicketsBot/GoPanel/utils"
"github.com/gin-gonic/gin"
"strconv"
)
@ -12,19 +13,13 @@ func UserHandler(ctx *gin.Context) {
userId, err := strconv.ParseUint(ctx.Param("user"), 10, 64)
if err != nil {
ctx.AbortWithStatusJSON(400, gin.H{
"success": false,
"error": "Invalid user ID",
})
ctx.JSON(400, utils.ErrorStr("Invalid user ID"))
return
}
var username string
if err := cache.Instance.QueryRow(context.Background(), `SELECT "data"->>'Username' FROM users WHERE users.user_id=$1 AND EXISTS(SELECT FROM members WHERE members.guild_id=$2);`, userId, guildId).Scan(&username); err != nil {
ctx.JSON(404, gin.H{
"success": false,
"error": "Not found",
})
ctx.JSON(404, utils.ErrorStr("Not found"))
return
}

View File

@ -2,43 +2,43 @@ package api
import (
"github.com/TicketsBot/GoPanel/database"
"github.com/TicketsBot/GoPanel/utils"
"github.com/gin-gonic/gin"
"strconv"
"github.com/rxdn/gdl/objects/user"
)
type whitelabelResponse struct {
Id uint64 `json:"id,string"`
statusUpdateBody
}
func WhitelabelGet(ctx *gin.Context) {
userId := ctx.Keys["userid"].(uint64)
// Check if this is a different token
bot, err := database.Client.Whitelabel.GetByUserId(userId)
if err != nil {
ctx.JSON(500, gin.H{
"success": false,
"error": err.Error(),
})
ctx.JSON(500, utils.ErrorJson(err))
return
}
if bot.BotId == 0 {
ctx.JSON(404, gin.H{
"success": false,
"error": "No bot found",
})
} else {
// Get status
status, err := database.Client.WhitelabelStatuses.Get(bot.BotId)
if err != nil {
ctx.JSON(500, gin.H{
"success": false,
"error": err.Error(),
})
ctx.JSON(404, utils.ErrorStr("No bot found"))
return
}
ctx.JSON(200, gin.H{
"success": true,
"id": strconv.FormatUint(bot.BotId, 10),
"status": status,
})
// Get status
status, statusType, _, err := database.Client.WhitelabelStatuses.Get(bot.BotId)
if err != nil {
ctx.JSON(500, utils.ErrorJson(err))
return
}
ctx.JSON(200, whitelabelResponse{
Id: bot.BotId,
statusUpdateBody: statusUpdateBody{ // Zero values if no status is fine
Status: status,
StatusType: user.ActivityType(statusType),
},
})
}

View File

@ -2,6 +2,7 @@ package api
import (
"github.com/TicketsBot/GoPanel/database"
"github.com/TicketsBot/GoPanel/utils"
"github.com/gin-gonic/gin"
)
@ -10,10 +11,7 @@ func WhitelabelGetErrors(ctx *gin.Context) {
errors, err := database.Client.WhitelabelErrors.GetRecent(userId, 10)
if err != nil {
ctx.JSON(500, gin.H{
"success": false,
"error": err.Error(),
})
ctx.JSON(500, utils.ErrorJson(err))
return
}

View File

@ -3,6 +3,7 @@ package api
import (
"github.com/TicketsBot/GoPanel/database"
"github.com/TicketsBot/GoPanel/rpc/cache"
"github.com/TicketsBot/GoPanel/utils"
"github.com/gin-gonic/gin"
"strconv"
)
@ -12,10 +13,7 @@ func WhitelabelGetGuilds(ctx *gin.Context) {
bot, err := database.Client.Whitelabel.GetByUserId(userId)
if err != nil {
ctx.JSON(500, gin.H{
"success": false,
"error": err.Error(),
})
ctx.JSON(500, utils.ErrorJson(err))
return
}
@ -31,10 +29,7 @@ func WhitelabelGetGuilds(ctx *gin.Context) {
ids, err := database.Client.WhitelabelGuilds.GetGuilds(bot.BotId)
if err != nil {
ctx.JSON(500, gin.H{
"success": false,
"error": err.Error(),
})
ctx.JSON(500, utils.ErrorJson(err))
return
}

View File

@ -2,6 +2,7 @@ package api
import (
"github.com/TicketsBot/GoPanel/database"
"github.com/TicketsBot/GoPanel/utils"
"github.com/gin-gonic/gin"
)
@ -15,10 +16,7 @@ func WhitelabelGetPublicKey(ctx *gin.Context) {
// Get bot
bot, err := database.Client.Whitelabel.GetByUserId(userId)
if err != nil {
ctx.JSON(500, gin.H{
"success": false,
"error": err.Error(),
})
ctx.JSON(500, utils.ErrorJson(err))
return
}
@ -33,10 +31,7 @@ func WhitelabelGetPublicKey(ctx *gin.Context) {
key, err := database.Client.WhitelabelKeys.Get(bot.BotId)
if err != nil {
ctx.JSON(500, gin.H{
"success": false,
"error": err.Error(),
})
ctx.JSON(500, utils.ErrorJson(err))
return
}

View File

@ -52,10 +52,7 @@ func WhitelabelPost(ctx *gin.Context) {
// Check if this is a different token
existing, err := dbclient.Client.Whitelabel.GetByUserId(userId)
if err != nil {
ctx.JSON(500, gin.H{
"success": false,
"error": err.Error(),
})
ctx.JSON(500, utils.ErrorJson(err))
return
}
@ -64,10 +61,7 @@ func WhitelabelPost(ctx *gin.Context) {
BotId: bot.Id,
Token: token,
}); err != nil {
ctx.JSON(500, gin.H{
"success": false,
"error": err.Error(),
})
ctx.JSON(500, utils.ErrorJson(err))
return
}
@ -78,10 +72,7 @@ func WhitelabelPost(ctx *gin.Context) {
}
if err := tokenchange.PublishTokenChange(redis.Client.Client, tokenChangeData); err != nil {
ctx.JSON(500, gin.H{
"success": false,
"error": err.Error(),
})
ctx.JSON(500, utils.ErrorJson(err))
return
}

View File

@ -3,6 +3,7 @@ package api
import (
"encoding/hex"
"github.com/TicketsBot/GoPanel/database"
"github.com/TicketsBot/GoPanel/utils"
"github.com/gin-gonic/gin"
)
@ -16,10 +17,7 @@ func WhitelabelPostPublicKey(ctx *gin.Context) {
// Get bot
bot, err := database.Client.Whitelabel.GetByUserId(userId)
if err != nil {
ctx.JSON(500, gin.H{
"success": false,
"error": err.Error(),
})
ctx.JSON(500, utils.ErrorJson(err))
return
}
@ -52,10 +50,7 @@ func WhitelabelPostPublicKey(ctx *gin.Context) {
}
if err := database.Client.WhitelabelKeys.Set(bot.BotId, body.PublicKey); err != nil {
ctx.JSON(500, gin.H{
"success": false,
"error": err.Error(),
})
ctx.JSON(500, utils.ErrorJson(err))
return
}

View File

@ -3,75 +3,66 @@ package api
import (
"github.com/TicketsBot/GoPanel/database"
"github.com/TicketsBot/GoPanel/redis"
"github.com/TicketsBot/GoPanel/utils"
"github.com/TicketsBot/common/statusupdates"
"github.com/gin-gonic/gin"
"github.com/rxdn/gdl/objects/user"
)
type statusUpdateBody struct {
Status string `json:"status"`
StatusType user.ActivityType `json:"status_type,string"`
}
func WhitelabelStatusPost(ctx *gin.Context) {
userId := ctx.Keys["userid"].(uint64)
// Get bot
bot, err := database.Client.Whitelabel.GetByUserId(userId)
if err != nil {
ctx.JSON(500, gin.H{
"success": false,
"error": err.Error(),
})
ctx.JSON(500, utils.ErrorJson(err))
return
}
// Ensure bot exists
if bot.BotId == 0 {
ctx.JSON(404, gin.H{
"success": false,
"error": "No bot found",
})
ctx.JSON(404, utils.ErrorStr("No bot found"))
return
}
// Parse status
var status string
{
var data map[string]string
var data statusUpdateBody
if err := ctx.BindJSON(&data); err != nil {
ctx.JSON(400, gin.H{
"success": false,
"error": "No status provided",
})
ctx.JSON(400, utils.ErrorStr("Invalid request body"))
return
}
var ok bool
status, ok = data["status"]
if !ok {
ctx.JSON(400, gin.H{
"success": false,
"error": "No status provided",
})
// Validate status length
if len(data.Status) == 0 || len(data.Status) > 255 {
ctx.JSON(400, utils.ErrorStr("Status must be between 1-255 characters in length"))
return
}
if len(status) == 0 || len(status) > 255 {
ctx.JSON(400, gin.H{
"success": false,
"error": "Status must be between 1-255 characters in length",
})
return
}
// Validate status type
validActivities := []user.ActivityType{
user.ActivityTypePlaying,
user.ActivityTypeListening,
user.ActivityTypeWatching,
}
if err := database.Client.WhitelabelStatuses.Set(bot.BotId, status); err != nil {
ctx.JSON(500, gin.H{
"success": false,
"error": err.Error(),
})
if !utils.Contains(validActivities, data.StatusType) {
ctx.JSON(400, utils.ErrorStr("Invalid status type"))
return
}
// Update in database
if err := database.Client.WhitelabelStatuses.Set(bot.BotId, data.Status, int16(data.StatusType)); err != nil {
ctx.JSON(500, utils.ErrorJson(err))
return
}
// Send status update to sharder
go statusupdates.Publish(redis.Client.Client, bot.BotId)
ctx.JSON(200, gin.H{
"success": true,
"bot": bot,
})
ctx.JSON(200, utils.SuccessResponse)
}

View File

@ -53,7 +53,6 @@ var timeout = time.Second * 60
func WebChatWs(ctx *gin.Context) {
conn, err := upgrader.Upgrade(ctx.Writer, ctx.Request, nil)
if err != nil {
fmt.Println(err.Error())
return
}
@ -95,7 +94,6 @@ func WebChatWs(ctx *gin.Context) {
for {
err := conn.WriteMessage(websocket.PingMessage, []byte("keepalive"))
if err != nil {
fmt.Println(err.Error())
conn.Close()
conn.CloseHandler()(1000, "")
return
@ -156,7 +154,6 @@ func WebChatWs(ctx *gin.Context) {
// Verify the user has permissions to be here
permLevel, err := utils.GetPermissionLevel(authData.GuildId, userId)
if err != nil {
fmt.Println(err.Error())
conn.Close()
return
}

View File

@ -30,8 +30,6 @@ func Render(payload Payload) ([]byte, error) {
}
if res.StatusCode != 200 {
fmt.Println(string(encoded))
sentry.CaptureEvent(&sentry.Event{
Extra: map[string]interface{}{
"request_body": string(encoded),

View File

@ -12,10 +12,12 @@
<div class="buttons">
<div class="col">
<Button icon="fas fa-paper-plane" on:click={submitToken} fullWidth="{true}">Submit</Button>
<Button icon="fas fa-paper-plane" on:click={submitToken} fullWidth="{true}">Submit
</Button>
</div>
<div class="col">
<Button icon="fas fa-plus" on:click={invite} fullWidth="{true}" disabled="{bot.id === undefined}">
<Button icon="fas fa-plus" on:click={invite} fullWidth="{true}"
disabled="{bot.id === undefined}">
Generate Invite Link
</Button>
</div>
@ -30,7 +32,8 @@
<div slot="body" class="full-width">
<form class="full-width" onsubmit="return false;">
<label class="form-label">Interactions Endpoint URL</label>
<input name="token" type="text" bind:value={interactionUrl} class="form-input full-width" readonly>
<input name="token" type="text" bind:value={interactionUrl} class="form-input full-width"
readonly>
<label class="form-label">Public Key</label>
<input name="token" type="text" bind:value={publicKey} class="form-input full-width">
@ -57,9 +60,18 @@
<Card footer="{false}" fill="{false}">
<h4 slot="title">Custom Status</h4>
<div slot="body" class="full-width">
<form class="full-width" onsubmit="return false;">
<label class="form-label">Status</label>
<input name="token" type="text" bind:value={bot.status} class="form-input full-width" placeholder="/help">
<form class="form-wrapper full-width" onsubmit="return false;">
<div class="row">
<Dropdown col3 label="Status Type" bind:value={bot.status_type}>
<option value="0">Playing</option>
<option value="2">Listening</option>
<option value="3">Watching</option>
</Dropdown>
<div class="col-2-3">
<Input col1 label="Status Text" placeholder="/help" bind:value={bot.status} />
</div>
</div>
<div class="buttons">
<Button icon="fas fa-paper-plane" on:click={updateStatus} fullWidth="{true}"
@ -179,6 +191,22 @@
.table-border {
border-top: 1px solid #dee2e6;
}
.form-wrapper {
display: flex;
flex-direction: column;
width: 100%;
height: 100%;
}
.row {
display: flex;
flex-direction: row;
justify-content: space-between;
width: 100%;
height: 100%;
gap: 10px;
}
</style>
<script>
@ -188,6 +216,8 @@
import Button from '../components/Button.svelte'
import {API_URL} from "../js/constants";
import {setDefaultHeaders} from '../includes/Auth.svelte'
import Input from "../components/form/Input.svelte";
import Dropdown from "../components/form/Dropdown.svelte";
setDefaultHeaders()
@ -200,7 +230,7 @@
async function invite() {
const res = await axios.get(`${API_URL}/user/whitelabel/`);
if (res.status !== 200 || !res.data.success) {
if (res.status !== 200) {
notifyError(res.data.error);
return;
}
@ -246,6 +276,7 @@
async function updateStatus() {
const data = {
status: bot.status,
status_type: bot.status_type,
};
const res = await axios.post(`${API_URL}/user/whitelabel/status`, data);
@ -264,7 +295,7 @@
async function loadBot() {
const res = await axios.get(`${API_URL}/user/whitelabel/`);
if (res.status !== 200 || !res.data.success) {
if (res.status !== 200) {
if (res.status === 402) {
window.location.replace("https://ticketsbot.net/premium");
return false;
@ -273,6 +304,7 @@
if (res.status !== 404) {
notifyError(res.data.error);
}
return true;
}
@ -314,7 +346,7 @@
return;
}
if (res.status !== 200 || !res.data.success) {
if (res.status !== 200) {
notifyError(res.data.error);
return;
}

8
go.mod
View File

@ -5,10 +5,10 @@ go 1.18
require (
github.com/BurntSushi/toml v0.3.1
github.com/TicketsBot/archiverclient v0.0.0-20220326163414-558fd52746dc
github.com/TicketsBot/common v0.0.0-20220609182514-8d43f86e8253
github.com/TicketsBot/database v0.0.0-20220618184239-b5ab901854fb
github.com/TicketsBot/common v0.0.0-20220615205931-a6a31e73b52a
github.com/TicketsBot/database v0.0.0-20220621182433-accd1b2b81de
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-20220621165800-203b0004b733
github.com/apex/log v1.1.2
github.com/getsentry/sentry-go v0.13.0
github.com/gin-contrib/static v0.0.0-20191128031702-f81c604d8ac2
@ -22,7 +22,7 @@ require (
github.com/jackc/pgx/v4 v4.7.1
github.com/pasztorpisti/qs v0.0.0-20171216220353-8d6c33ee906c
github.com/pkg/errors v0.9.1
github.com/rxdn/gdl v0.0.0-20220614155333-7e6d7486acdd
github.com/rxdn/gdl v0.0.0-20220621165443-28e214d254c1
github.com/sirupsen/logrus v1.5.0
golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9
)

20
go.sum
View File

@ -3,20 +3,16 @@ github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03
github.com/ReneKroon/ttlcache v1.6.0/go.mod h1:DG6nbhXKUQhrExfwwLuZUdH7UnRDDRA1IW+nBuCssvs=
github.com/TicketsBot/archiverclient v0.0.0-20220326163414-558fd52746dc h1:n15W8Eg+ik3/0yqPzZVRP2oZJcIZCIgQ071cZleedKo=
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/go.mod h1:ZAoYcDD7SQLTsZT7dbo/X0J256+pogVRAReunCGng+U=
github.com/TicketsBot/database v0.0.0-20220616145240-1b6207291ca6 h1:lq5+CXNCQRUyd3ODq1Y6tUsEY7Y0e1YfLQr50C0Nuis=
github.com/TicketsBot/database v0.0.0-20220616145240-1b6207291ca6/go.mod h1:F57cywrZsnper1cy56Bx0c/HEsxQBLHz3Pl98WXblWw=
github.com/TicketsBot/database v0.0.0-20220616215313-0f5a33c3a2a6 h1:DC9CoT5uMuIh0pYX69euWLa/0MZLZA4sA+umIhOr0qo=
github.com/TicketsBot/database v0.0.0-20220616215313-0f5a33c3a2a6/go.mod h1:F57cywrZsnper1cy56Bx0c/HEsxQBLHz3Pl98WXblWw=
github.com/TicketsBot/database v0.0.0-20220618184239-b5ab901854fb h1:d9zo2sAW+EdZCWnkAiTKnCtH5urGZFwrntKv2F7Jdg8=
github.com/TicketsBot/database v0.0.0-20220618184239-b5ab901854fb/go.mod h1:F57cywrZsnper1cy56Bx0c/HEsxQBLHz3Pl98WXblWw=
github.com/TicketsBot/common v0.0.0-20220615205931-a6a31e73b52a h1:SwA18cDURmnXSrKBdetNVanSsyJBMtyosDzvgYMpKP4=
github.com/TicketsBot/common v0.0.0-20220615205931-a6a31e73b52a/go.mod h1:ZAoYcDD7SQLTsZT7dbo/X0J256+pogVRAReunCGng+U=
github.com/TicketsBot/database v0.0.0-20220621182433-accd1b2b81de h1:UsRiB3KIwqIF92huRBFKAnCoGLyT9kBYYUycsapBZk0=
github.com/TicketsBot/database v0.0.0-20220621182433-accd1b2b81de/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/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/go.mod h1:2zPxDAN2TAPpxUPjxszjs3QFKreKrQh5al/R3cMXmYk=
github.com/TicketsBot/worker v0.0.0-20220614162334-f81bf3f39aa5 h1:c4bLQar8XH8cGK2nL2yUUP1bFoss0405QLG4MNeDoqY=
github.com/TicketsBot/worker v0.0.0-20220614162334-f81bf3f39aa5/go.mod h1:kmap6C09BAbyqLqg8ZX+wDuNhbeZuSJbXwv3SvBtgtw=
github.com/TicketsBot/worker v0.0.0-20220621165800-203b0004b733 h1:G4iUjk4lgGRvbRCSJshpwuQetl+z3v7PmHzIW+HII9k=
github.com/TicketsBot/worker v0.0.0-20220621165800-203b0004b733/go.mod h1:fhEqdxVhgXds/xB3ql05XSDqPLF4XWjkfyHr+JQFe0g=
github.com/apex/log v1.1.2 h1:bnDuVoi+o98wOdVqfEzNDlY0tcmBia7r4YkjS9EqGYk=
github.com/apex/log v1.1.2/go.mod h1:SyfRweFO+TlkIJ3DVizTSeI1xk7jOIIqOnUPZQTTsww=
github.com/apex/logs v0.0.3/go.mod h1:XzxuLZ5myVHDy9SAmYpamKKRNApGj54PfYLcFrXqDwo=
@ -264,8 +260,8 @@ github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFR
github.com/rs/xid v1.2.1/go.mod h1:+uKXf+4Djp6Md1KODXJxgGQPKngRmWyn10oCKFzNHOQ=
github.com/rs/zerolog v1.13.0/go.mod h1:YbFCdg8HfsridGWAh22vktObvhZbQsZXe4/zB0OKkWU=
github.com/rs/zerolog v1.15.0/go.mod h1:xYTKnLHcpfU2225ny5qZjxnj9NvkumZYjJHlAThCjNc=
github.com/rxdn/gdl v0.0.0-20220614155333-7e6d7486acdd h1:lOwJSNyfd9Lyl5VKQDnv738x7//iZEkp8m277u27MVM=
github.com/rxdn/gdl v0.0.0-20220614155333-7e6d7486acdd/go.mod h1:HtxfLp4OaoPoDJHQ4JOx/QeLH2d40VgT3wNOf7ETsRE=
github.com/rxdn/gdl v0.0.0-20220621165443-28e214d254c1 h1:1/q9ohADLOrMQwhTfxRplPiMQ6EmVnJB+pWb+SLHd0c=
github.com/rxdn/gdl v0.0.0-20220621165443-28e214d254c1/go.mod h1:HtxfLp4OaoPoDJHQ4JOx/QeLH2d40VgT3wNOf7ETsRE=
github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0=
github.com/schollz/progressbar/v3 v3.8.2 h1:2kZJwZCpb+E/V79kGO7daeq+hUwUJW0A5QD1Wv455dA=
github.com/schollz/progressbar/v3 v3.8.2/go.mod h1:9KHLdyuXczIsyStQwzvW8xiELskmX7fQMaZdN23nAv8=