diff --git a/.vscode/launch.json b/.vscode/launch.json index 9850de5..70eae82 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -4,6 +4,14 @@ // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 "version": "0.2.0", "configurations": [ + { + "name": "Tunnel Client", + "type": "go", + "request": "launch", + "mode": "debug", + "args": ["--dev"], + "program": "${workspaceFolder}/servers/tunnel-client/main.go" + }, { "name": "Soham Client Release Server", "type": "go", @@ -20,6 +28,14 @@ "args": ["--dev"], "program": "${workspaceFolder}/apps/sohan/whatsapp/main.go" }, + { + "name": "Run File Server", + "type": "go", + "request": "launch", + "mode": "auto", + "args": ["--dev"], + "program": "${workspaceFolder}/servers/file-server-middleware/main.go" + }, { "name": "Run Telegram Server", "type": "go", diff --git a/apps/sohan/whatsapp/.gitignore b/apps/sohan/whatsapp/.gitignore new file mode 100644 index 0000000..fb0fa99 --- /dev/null +++ b/apps/sohan/whatsapp/.gitignore @@ -0,0 +1,4 @@ +whatsapp-client* +*.lock +*.json +*.db \ No newline at end of file diff --git a/apps/sohan/whatsapp/FyneApp12333.toml b/apps/sohan/whatsapp/FyneApp12333.toml new file mode 100644 index 0000000..51032f5 --- /dev/null +++ b/apps/sohan/whatsapp/FyneApp12333.toml @@ -0,0 +1,6 @@ +Website = "https://rpso.in" +Details = "A description of your application" +Name = "WABOT" +ID = "in.rpso.wabot" +Icon = "icon.ico" +Version = "1.0.0" \ No newline at end of file diff --git a/apps/sohan/whatsapp/WhatsappSuperSecrete.db b/apps/sohan/whatsapp/WhatsappSuperSecrete.db deleted file mode 100644 index 0d90462..0000000 Binary files a/apps/sohan/whatsapp/WhatsappSuperSecrete.db and /dev/null differ diff --git a/apps/sohan/whatsapp/auto-download/index.go b/apps/sohan/whatsapp/auto-download/index.go index c614304..8e86912 100644 --- a/apps/sohan/whatsapp/auto-download/index.go +++ b/apps/sohan/whatsapp/auto-download/index.go @@ -9,12 +9,14 @@ import ( "log" "net/http" "os" + "path/filepath" "runtime" "time" "fyne.io/fyne/v2" "fyne.io/fyne/v2/widget" - soham_whatsapp_gui_config "github.com/rpsoftech/golang-servers/apps/sohan/whatsapp/config" + sohan_whatsapp_keys "github.com/rpsoftech/golang-servers/apps/sohan/whatsapp/keys" + utility_functions_gzip "github.com/rpsoftech/golang-servers/utility/functions/gzip" ) const VersionFileName = "client-version.json" @@ -112,6 +114,7 @@ func CheckAndDownload(progress *widget.ProgressBar, win fyne.Window) string { if runtime.GOOS == "windows" { serverBinary = "whatsapp-client.exe" } + serverBinary = filepath.Join(sohan_whatsapp_keys.ConfigDir, serverBinary) if checkAndRunCalled { return serverBinary } @@ -135,7 +138,7 @@ func CheckAndDownload(progress *widget.ProgressBar, win fyne.Window) string { json.Unmarshal(data, &local) } - tmpFile := serverBinary + ".tmp" + gzipFile := serverBinary + ".gz" needDownload := false @@ -148,11 +151,11 @@ func CheckAndDownload(progress *widget.ProgressBar, win fyne.Window) string { } if needDownload { - os.Remove(tmpFile) + os.Remove(gzipFile) fyne.DoAndWait(func() { win.Show() }) - err := downloadFileWithProgress(cloud.URL, tmpFile, progress) + err := downloadFileWithProgress(cloud.URL, gzipFile, progress) if err != nil { if _, err := os.Stat(serverBinary); os.IsNotExist(err) { panic(fmt.Errorf("File Downloading Failed")) @@ -161,16 +164,16 @@ func CheckAndDownload(progress *widget.ProgressBar, win fyne.Window) string { return serverBinary } - hash, err := sha256File(tmpFile) + hash, err := sha256File(gzipFile) if err != nil { return serverBinary } if hash != cloud.SHA256 { - os.Remove(tmpFile) + os.Remove(gzipFile) return serverBinary } - err = replaceBinarySafe(tmpFile, serverBinary) + err = replaceBinarySafe(gzipFile, serverBinary) if err != nil { log.Println("Binary replace failed:", err) return serverBinary @@ -219,9 +222,9 @@ func downloadFileWithProgress(url string, filepath string, progress *widget.Prog func replaceBinarySafe(tmpFile string, serverBinary string) error { // stop server first - if soham_whatsapp_gui_config.ServerCmd != nil && soham_whatsapp_gui_config.ServerCmd.Process != nil { - soham_whatsapp_gui_config.ServerCmd.Process.Kill() - time.Sleep(1 * time.Second) + if sohan_whatsapp_keys.ServerCmd != nil && sohan_whatsapp_keys.ServerCmd.Process != nil { + sohan_whatsapp_keys.ServerCmd.Process.Kill() + time.Sleep(3 * time.Second) } // backup existing binary @@ -234,7 +237,7 @@ func replaceBinarySafe(tmpFile string, serverBinary string) error { } // move new binary - err := os.Rename(tmpFile, serverBinary) + err := utility_functions_gzip.GzipDecompressFile(tmpFile, serverBinary) if err != nil { return err } diff --git a/apps/sohan/whatsapp/client-version.json b/apps/sohan/whatsapp/client-version.json deleted file mode 100644 index b58e5ef..0000000 --- a/apps/sohan/whatsapp/client-version.json +++ /dev/null @@ -1 +0,0 @@ -{"version":1,"url":"https://files.rpso.in/static/soham/wbot/darwin_arm64/whatsapp-client.o","sha256":"0d2cd272835b72535a9f4b8e9f6cfb58f59772b74d0e6eb9461b3ec120ad497b"} \ No newline at end of file diff --git a/apps/sohan/whatsapp/config/index.go b/apps/sohan/whatsapp/config/index.go index bd016b4..370e1cc 100644 --- a/apps/sohan/whatsapp/config/index.go +++ b/apps/sohan/whatsapp/config/index.go @@ -1,39 +1,61 @@ package soham_whatsapp_gui_config import ( + "bytes" + "encoding/base64" "encoding/json" "errors" "fmt" + "image" + "io" "log" + "net/http" "os" - "os/exec" "path/filepath" + "strings" - "github.com/rpsoftech/golang-servers/env" + "fyne.io/fyne/v2" + "fyne.io/fyne/v2/canvas" + "github.com/google/uuid" + sohan_whatsapp_keys "github.com/rpsoftech/golang-servers/apps/sohan/whatsapp/keys" whatsapp_config "github.com/rpsoftech/golang-servers/functions/whatsapp/config" whatsapp_interfaces "github.com/rpsoftech/golang-servers/interfaces/whatsapp" utility_functions "github.com/rpsoftech/golang-servers/utility/functions" "github.com/rpsoftech/golang-servers/validator" ) -var ServerConfigFilePath = "" -var ServerCmd *exec.Cmd +type LoginStatusApiReponse struct { + Status int `json:"status"` +} + +type QrCodeApiCallResponse struct { + QrCode string `json:"qrCode"` + QrCodeData string `json:"qrCodeData"` +} func init() { - CurrentDirectory := env.FindAndReturnCurrentDir() - ServerConfigFilePath = filepath.Join(CurrentDirectory, whatsapp_config.ServerConfigFileName) + // CurrentDirectory := env.FindAndReturnCurrentDir() + dirname, err := os.UserHomeDir() + if err != nil { + log.Fatal(err) + } + // fmt.Println(dirname) + sohan_whatsapp_keys.HomeDir = dirname + sohan_whatsapp_keys.ConfigDir = filepath.Join(dirname, ".wabot_service") + sohan_whatsapp_keys.ServerConfigFilePath = filepath.Join(sohan_whatsapp_keys.ConfigDir, whatsapp_config.ServerConfigFileName) } -func ValidateConfig() bool { - if _, err := utility_functions.Exist(ServerConfigFilePath); errors.Is(err, os.ErrNotExist) { - panic(fmt.Errorf("CONFIG_NOT_EXIST_ON_PATH %s", ServerConfigFilePath)) +func ValidateConfig() (bool, *whatsapp_interfaces.IServerConfig) { + if _, err := utility_functions.Exist(sohan_whatsapp_keys.ServerConfigFilePath); errors.Is(err, os.ErrNotExist) { + // panic(fmt.Errorf("CONFIG_NOT_EXIST_ON_PATH %s", sohan_whatsapp_keys.ServerConfigFilePath)) + return false, nil } - _, err := readConfigFileAndReturniserverConfig(ServerConfigFilePath) + config, err := readConfigFileAndReturniserverConfig(sohan_whatsapp_keys.ServerConfigFilePath) if err != nil { - return false + return false, nil // panic(err) } - return true + return true, config } func readConfigFileAndReturniserverConfig(configFilePath string) (*whatsapp_interfaces.IServerConfig, error) { @@ -50,7 +72,15 @@ func readConfigFileAndReturniserverConfig(configFilePath string) (*whatsapp_inte return nil, err } if errs := validator.Validator.Validate(config); len(errs) > 0 { - panic(fmt.Errorf("CONFIG_ERROR %#v", errs)) + return nil, fmt.Errorf("CONFIG_ERROR %#v", errs) + } + if len(config.Tokens) == 0 { + return nil, errors.New("NO_TOKENS") + } + for token := range config.Tokens { + if _, err := ValidUUID(token); err != "" { + return nil, errors.New(err) + } } if config.JID == nil { config.JID = make(map[string]string) @@ -69,3 +99,106 @@ func SaveConfig(config *whatsapp_interfaces.IServerConfig) { log.Fatal(err) } } + +func CreateQRFromBase64(base64Str string) (*canvas.Image, error) { + + data, err := base64.StdEncoding.DecodeString(base64Str) + if err != nil { + return nil, err + } + + img, _, err := image.Decode(bytes.NewReader(data)) + if err != nil { + return nil, err + } + + qr := canvas.NewImageFromImage(img) + + qr.FillMode = canvas.ImageFillContain + + qr.SetMinSize( + fyne.NewSize(200, 200), + ) + + return qr, nil +} + +////////////////////////////////////////////////////// +// UUID VALIDATION +////////////////////////////////////////////////////// + +func ValidUUID(uuidstring string) (bool, string) { + u, err := uuid.Parse(uuidstring) + if err != nil { + return false, fmt.Sprintf("String %q is invalid: %v\n", uuidstring, err) + } + // Check if it is specifically version 5 + if u.Version() == 5 { + return true, "" + } else { + return false, fmt.Sprintf("It is UUID Version %d.\n", u.Version()) + } +} + +func QrCodeApiCall(token string) (bool, string) { + req, err := http.NewRequest("GET", sohan_whatsapp_keys.QRCODEURL, nil) + + if err != nil { + fmt.Println(err) + return false, "" + } + req.Header.Add("X-Api-Token", token) + res, err := http.DefaultClient.Do(req) + if err != nil { + fmt.Println(err) + return false, "" + } + defer res.Body.Close() + body, err := io.ReadAll(res.Body) + if err != nil { + fmt.Println(err) + return false, "" + } + if strings.Contains(string(body), "success") { + return false, "" + } + qrcodeRespo := new(QrCodeApiCallResponse) + err = json.Unmarshal(body, qrcodeRespo) + if err != nil { + fmt.Println(err) + return false, "" + } + return true, qrcodeRespo.QrCode +} +func LoginApiCall(token string) (bool, error) { + req, err := http.NewRequest("GET", sohan_whatsapp_keys.LoginStatusURL, nil) + + if err != nil { + fmt.Println(err) + return false, err + } + req.Header.Add("X-Api-Token", token) + res, err := http.DefaultClient.Do(req) + if err != nil { + fmt.Println(err) + return false, err + } + defer res.Body.Close() + body, err := io.ReadAll(res.Body) + if err != nil { + fmt.Println(err) + return false, err + } + statusRespo := new(LoginStatusApiReponse) + err = json.Unmarshal(body, statusRespo) + if err != nil { + fmt.Println(err) + return false, err + } + if statusRespo.Status == 1 { + return true, nil + } else { + return false, nil + + } +} diff --git a/apps/sohan/whatsapp/gui.lock b/apps/sohan/whatsapp/gui.lock deleted file mode 100644 index b26915b..0000000 --- a/apps/sohan/whatsapp/gui.lock +++ /dev/null @@ -1 +0,0 @@ -14605 \ No newline at end of file diff --git a/apps/sohan/whatsapp/icon.go b/apps/sohan/whatsapp/icon.go new file mode 100644 index 0000000..2f142b9 --- /dev/null +++ b/apps/sohan/whatsapp/icon.go @@ -0,0 +1,16 @@ +// auto-generated +// Code generated by '$ fyne bundle'. DO NOT EDIT. + +package main + +import ( + _ "embed" + "fyne.io/fyne/v2" +) + +//go:embed icon.png +var resourceIconPngData []byte +var resourceIconPng = &fyne.StaticResource{ + StaticName: "icon.png", + StaticContent: resourceIconPngData, +} diff --git a/apps/sohan/whatsapp/icon.ico b/apps/sohan/whatsapp/icon.ico new file mode 100644 index 0000000..35932d9 Binary files /dev/null and b/apps/sohan/whatsapp/icon.ico differ diff --git a/apps/sohan/whatsapp/keys/index.go b/apps/sohan/whatsapp/keys/index.go new file mode 100644 index 0000000..fcb4b53 --- /dev/null +++ b/apps/sohan/whatsapp/keys/index.go @@ -0,0 +1,11 @@ +package sohan_whatsapp_keys + +import "os/exec" + +var ServerConfigFilePath = "" +var ServerCmd *exec.Cmd +var HomeDir string +var ConfigDir string + +const QRCODEURL = "http://localhost:4000/v1/qr_code" +const LoginStatusURL = "http://localhost:4000/v1/status" diff --git a/apps/sohan/whatsapp/main.go b/apps/sohan/whatsapp/main.go index 0853f33..a0fe8a2 100644 --- a/apps/sohan/whatsapp/main.go +++ b/apps/sohan/whatsapp/main.go @@ -1,11 +1,14 @@ +//go:build windows + package main import ( + "fmt" "log" "os" "os/exec" "path/filepath" - "regexp" + "runtime" "strconv" "syscall" "time" @@ -19,6 +22,7 @@ import ( "fyne.io/fyne/v2/widget" sohan_whatsapp_auto_download "github.com/rpsoftech/golang-servers/apps/sohan/whatsapp/auto-download" soham_whatsapp_gui_config "github.com/rpsoftech/golang-servers/apps/sohan/whatsapp/config" + sohan_whatsapp_keys "github.com/rpsoftech/golang-servers/apps/sohan/whatsapp/keys" "github.com/rpsoftech/golang-servers/env" whatsapp_interfaces "github.com/rpsoftech/golang-servers/interfaces/whatsapp" utility_functions "github.com/rpsoftech/golang-servers/utility/functions" @@ -29,7 +33,10 @@ import ( ////////////////////////////////////////////////////// var mainWindow fyne.Window -var trayStatusItem *fyne.MenuItem +var trayMenu *fyne.Menu +var qrContainer = container.NewCenter( + widget.NewLabel("Loading QR..."), +) var version string var configFile = "config.json" var serverLock = "server.lock" @@ -44,19 +51,6 @@ type Config struct { Number string `json:"number"` } -////////////////////////////////////////////////////// -// UUID VALIDATION -////////////////////////////////////////////////////// - -func validUUID(uuid string) bool { - - reg := regexp.MustCompile( - `^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[1-5][a-fA-F0-9]{3}-[89abAB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$`, - ) - - return reg.MatchString(uuid) -} - ////////////////////////////////////////////////////// // SINGLE GUI INSTANCE ////////////////////////////////////////////////////// @@ -131,9 +125,9 @@ func startServer(a fyne.App) { if serverRunning() { return } - progressBar, progressWin := showDownloadProgress(a) go func() { + progressBar, progressWin := showDownloadProgress(a) serverBinary := sohan_whatsapp_auto_download.CheckAndDownload(progressBar, progressWin) // start server fyne.Do(func() { @@ -141,8 +135,14 @@ func startServer(a fyne.App) { }) for { updateTrayStatus("🟡 Starting server...") - soham_whatsapp_gui_config.ServerCmd = exec.Command(filepath.Join(env.FindAndReturnCurrentDir(), serverBinary)) - serverCmd := soham_whatsapp_gui_config.ServerCmd + sohan_whatsapp_keys.ServerCmd = exec.Command(serverBinary, "--dev") + serverCmd := sohan_whatsapp_keys.ServerCmd + if runtime.GOOS == "windows" { + serverCmd.SysProcAttr = &syscall.SysProcAttr{ + HideWindow: true, + CreationFlags: 0x08000000, // CREATE_NO_WINDOW + } + } if env.IsDev { stdout, err := serverCmd.StdoutPipe() if err != nil { @@ -160,7 +160,7 @@ func startServer(a fyne.App) { go utility_functions.StreamLogs(stdout, "SERVER") go utility_functions.StreamLogs(stderr, "SERVER") } - err := soham_whatsapp_gui_config.ServerCmd.Start() + err := sohan_whatsapp_keys.ServerCmd.Start() if err != nil { updateTrayStatus("🔴 Server failed") time.Sleep(50 * time.Second) @@ -168,7 +168,8 @@ func startServer(a fyne.App) { } updateTrayStatus("🟢 Server running") - err = soham_whatsapp_gui_config.ServerCmd.Wait() + err = sohan_whatsapp_keys.ServerCmd.Wait() + println(err) updateTrayStatus("🔴 Server stopped") time.Sleep(3 * time.Second) @@ -186,8 +187,8 @@ func startServer(a fyne.App) { func restartServer() { - if soham_whatsapp_gui_config.ServerCmd != nil && soham_whatsapp_gui_config.ServerCmd.Process != nil { - soham_whatsapp_gui_config.ServerCmd.Process.Kill() + if sohan_whatsapp_keys.ServerCmd != nil && sohan_whatsapp_keys.ServerCmd.Process != nil { + sohan_whatsapp_keys.ServerCmd.Process.Kill() } } @@ -201,7 +202,7 @@ func saveConfig(token, number string) { config.Tokens = make(map[string]string) config.JID = make(map[string]string) config.Tokens[token] = number - config.SetConfigPath(soham_whatsapp_gui_config.ServerConfigFilePath) + config.SetConfigPath(sohan_whatsapp_keys.ServerConfigFilePath) soham_whatsapp_gui_config.SaveConfig(config) } @@ -210,8 +211,8 @@ func saveConfig(token, number string) { ////////////////////////////////////////////////////// func loadConfig() bool { - - return soham_whatsapp_gui_config.ValidateConfig() + ok, _ := soham_whatsapp_gui_config.ValidateConfig() + return ok } ////////////////////////////////////////////////////// @@ -219,7 +220,63 @@ func loadConfig() bool { ////////////////////////////////////////////////////// func successScreen() fyne.CanvasObject { - + ok, config := soham_whatsapp_gui_config.ValidateConfig() + if !ok { + panic("Config issue") + } + initialLoggedin := true + for token := range config.Tokens { + go func() { + time.Sleep(3 * time.Second) + for { + loggedin, err := soham_whatsapp_gui_config.LoginApiCall(token) + if err != nil { + fmt.Println(err) + time.Sleep(5 * time.Second) + continue + } + if loggedin { + if initialLoggedin { + fyne.Do(func() { + mainWindow.Hide() + initialLoggedin = false + }) + } + if !qrContainer.Hidden { + fyne.Do(func() { + qrContainer.Hide() + }) + } + time.Sleep(5 * time.Second) + continue + } + ok, qrcode := soham_whatsapp_gui_config.QrCodeApiCall(token) + if !ok { + time.Sleep(5 * time.Second) + continue + } + img, err := soham_whatsapp_gui_config.CreateQRFromBase64(qrcode) + if err != nil { + fmt.Println(err) + time.Sleep(5 * time.Second) + continue + } + fyne.DoAndWait(func() { + if qrContainer.Hidden { + qrContainer.Show() + } + // if mainWindow. + qrContainer.Objects = []fyne.CanvasObject{ + container.NewCenter(img), + } + qrContainer.Refresh() + + }) + time.Sleep(10 * time.Second) + // break + } + }() + } msg := widget.NewLabelWithStyle( "Configuration Successful", fyne.TextAlignCenter, @@ -227,7 +284,6 @@ func successScreen() fyne.CanvasObject { ) restartBtn := widget.NewButton("Restart Server", func() { - msg.SetText("Restarting Server...") restartServer() }) @@ -248,7 +304,7 @@ func successScreen() fyne.CanvasObject { return container.NewVBox( layout.NewSpacer(), container.NewHBox(layout.NewSpacer(), msg, layout.NewSpacer()), - layout.NewSpacer(), + qrContainer, buttons, layout.NewSpacer(), ) @@ -270,8 +326,8 @@ func configForm(a fyne.App) fyne.CanvasObject { saveBtn := widget.NewButton("Save Config", func() { - if !validUUID(token.Text) { - status.SetText("Invalid UUID Token") + if ok, t := soham_whatsapp_gui_config.ValidUUID(token.Text); !ok { + status.SetText(t) return } @@ -306,8 +362,7 @@ func configForm(a fyne.App) fyne.CanvasObject { ) // embedded logo - logo := canvas.NewImageFromFile("icon.png") - + logo := canvas.NewImageFromResource(resourceIconPng) logo.FillMode = canvas.ImageFillContain logo.SetMinSize(fyne.NewSize(120, 80)) @@ -361,14 +416,17 @@ func showDownloadProgress(a fyne.App) (*widget.ProgressBar, fyne.Window) { ////////////////////////////////////////////////////// func updateTrayStatus(status string) { - - if trayStatusItem == nil { - return - } - - fyne.Do(func() { - trayStatusItem.Label = status - }) + return + // if trayStatusItem == nil { + // return + // } + + // fyne.DoAndWait(func() { + // log.Println("Here", status) + // trayStatusItem.Label = status + // // time.Sleep(1 * time.Second) + // trayMenu.Refresh() + // }) } // //////////////////////////////////////////////////// @@ -394,7 +452,7 @@ func SetEnv() { os.Setenv("AUTO_CONNECT_TO_WHATSAPP", "true") } if os.Getenv("OPEN_BROWSER_FOR_SCAN") == "" { - os.Setenv("OPEN_BROWSER_FOR_SCAN", "true") + os.Setenv("OPEN_BROWSER_FOR_SCAN", "false") } } @@ -418,17 +476,14 @@ func main() { a := app.New() // a.Settings().SetTheme(theme.) - window := a.NewWindow("RP Softech Config Tool") + window := a.NewWindow("WABOT Config Tool") window.Resize(fyne.NewSize(520, 380)) window.CenterOnScreen() mainWindow = window // embedded icon - iconResource, err := fyne.LoadResourceFromPath("icon.png") - if err == nil { - window.SetIcon(iconResource) - } + window.SetIcon(resourceIconPng) // window.SetIcon(icon) ////////////////////////////////////////////////// @@ -437,8 +492,7 @@ func main() { if desk, ok := a.(desktop.App); ok { - trayStatusItem = fyne.NewMenuItem("🟡 Starting...", nil) - trayStatusItem.Disabled = true + // trayStatusItem = fyne.NewMenuItem("🟡 Starting...", nil) showItem := fyne.NewMenuItem("Open Config", func() { window.Show() @@ -452,17 +506,16 @@ func main() { a.Quit() }) - menu := fyne.NewMenu("WABOT Utility", - trayStatusItem, - fyne.NewMenuItemSeparator(), + trayMenu := fyne.NewMenu("WABOT Utility", + // trayStatusItem, + // fyne.NewMenuItemSeparator(), showItem, restartItem, fyne.NewMenuItemSeparator(), quitItem, ) - - desk.SetSystemTrayMenu(menu) - desk.SetSystemTrayIcon(iconResource) + desk.SetSystemTrayMenu(trayMenu) + desk.SetSystemTrayIcon(resourceIconPng) } window.SetCloseIntercept(func() { @@ -476,11 +529,10 @@ func main() { if loadConfig() { window.SetContent(successScreen()) go func() { - time.Sleep(3 * time.Second) startServer(a) time.Sleep(3 * time.Second) fyne.Do(func() { - window.Hide() + // window.Hide() }) }() } else { diff --git a/apps/sohan/whatsapp/server.config.json b/apps/sohan/whatsapp/server.config.json deleted file mode 100644 index 642634a..0000000 --- a/apps/sohan/whatsapp/server.config.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "tokens": { - "1a7f33ae-3f54-5d53-b36e-9544017e87dc": "9428393489" - }, - "JID": {} -} \ No newline at end of file diff --git a/apps/sohan/whatsapp/whatsapp-client.o b/apps/sohan/whatsapp/whatsapp-client.o deleted file mode 100755 index df0b985..0000000 Binary files a/apps/sohan/whatsapp/whatsapp-client.o and /dev/null differ diff --git a/env/keys.go b/env/keys.go index f28a543..ae5666e 100644 --- a/env/keys.go +++ b/env/keys.go @@ -31,3 +31,6 @@ const MYSQL_PORT_KEY = "MYSQL_PORT" const MYSQL_USERNAME_KEY = "MYSQL_USERNAME" const MYSQL_PASSWORD_KEY = "MYSQL_PASSWORD" const MYSQL_DATABASE_KEY = "MYSQL_DATABASE" + +// REQ HEADER KEY +const XApiToken = "X-Api-Token" diff --git a/functions/whatsapp/core/index.go b/functions/whatsapp/core/index.go index 5bdf0e8..3953d17 100644 --- a/functions/whatsapp/core/index.go +++ b/functions/whatsapp/core/index.go @@ -46,6 +46,7 @@ func ConnectToNumber(jidString string, token string, sqlContainer *sqlstore.Cont var deviceStore *store.Device if !JID.IsEmpty() { var err error + // sqlContainer.DeleteDevice() deviceStore, err = sqlContainer.GetDevice(ctx, JID) if err != nil { println(err.Error()) @@ -55,11 +56,20 @@ func ConnectToNumber(jidString string, token string, sqlContainer *sqlstore.Cont deviceStore = sqlContainer.NewDevice() // deviceStore = types.DEv(number, types.DefaultUserServer) } + clientLog := waLog.Stdout("Client", "ERROR", true) client := whatsmeow.NewClient(deviceStore, clientLog) client.EnableAutoReconnect = true println(client.LastSuccessfulConnect.String()) - connection := &WhatsappConnection{Client: client, ConnectionStatus: 0, SyncFinished: false, Token: token} + connection := &WhatsappConnection{ + Client: client, + ConnectionStatus: 0, + SyncFinished: false, + Token: token, + ParentData: &ParentData{ + DeviceStore: deviceStore, + SqlContainer: sqlContainer, + }} client.AddEventHandler(connection.eventHandler) connection.ConnectAndGetQRCode() } diff --git a/functions/whatsapp/core/interfaces.go b/functions/whatsapp/core/interfaces.go index 2dc7472..4efef4b 100644 --- a/functions/whatsapp/core/interfaces.go +++ b/functions/whatsapp/core/interfaces.go @@ -3,6 +3,7 @@ package whatsapp_core import ( "context" "encoding/base64" + "encoding/json" "fmt" "log" "net/http" @@ -18,12 +19,20 @@ import ( whatsapp_utility "github.com/rpsoftech/golang-servers/utility/whatsapp/utility" "go.mau.fi/whatsmeow" "go.mau.fi/whatsmeow/proto/waE2E" + "go.mau.fi/whatsmeow/store" + "go.mau.fi/whatsmeow/store/sqlstore" "go.mau.fi/whatsmeow/types/events" + waLog "go.mau.fi/whatsmeow/util/log" "google.golang.org/protobuf/proto" ) type ( + ParentData struct { + DeviceStore *store.Device + SqlContainer *sqlstore.Container + } WhatsappConnection struct { + *ParentData Client *whatsmeow.Client Number string Token string @@ -85,7 +94,6 @@ func (connection *WhatsappConnection) ConnectAndGetQRCode() { qrterminal.GenerateHalfBlock(evt.Code, qrterminal.L, os.Stdout) } } else { - fmt.Println("Login event:", evt.Event) } } @@ -98,21 +106,32 @@ func (connection *WhatsappConnection) ConnectAndGetQRCode() { } } } +func (connection *WhatsappConnection) closeTheConnection() { + if err := connection.Client.Logout(ctx); err != nil { + connection.Client.Disconnect() + connection.Client.Store.Delete(ctx) + } + println(connection.Number, " Logged Out") + delete(ConnectionMap, connection.Token) + delete(whatsapp_config.WhatsappNumberConfigMap.JID, connection.Token) + whatsapp_config.WhatsappNumberConfigMap.Save() + connection.Client.Logout(ctx) + connection.Client.Store.DeleteAllSessions(ctx) + connection.ConnectionStatus = -1 + connection.ParentData.SqlContainer.DeleteDevice(ctx, connection.ParentData.DeviceStore) + deviceStore := connection.ParentData.SqlContainer.NewDevice() + client := whatsmeow.NewClient(deviceStore, waLog.Stdout("Client", "ERROR", true)) + client.EnableAutoReconnect = true + println(client.LastSuccessfulConnect.String()) + connection.Client = client + connection.ParentData.DeviceStore = deviceStore + go connection.ConnectAndGetQRCode() + +} func (connection *WhatsappConnection) eventHandler(evt interface{}) { switch v := evt.(type) { case *events.LoggedOut: - // Send Status - // connection.ConnectionStatus = -1 - // connection.Client.Disconnect() - if err := connection.Client.Logout(ctx); err != nil { - connection.Client.Disconnect() - connection.Client.Store.Delete(ctx) - } - println(connection.Number, " Logged Out") - delete(ConnectionMap, connection.Token) - delete(whatsapp_config.WhatsappNumberConfigMap.JID, connection.Token) - whatsapp_config.WhatsappNumberConfigMap.Save() - go connection.ConnectAndGetQRCode() + connection.closeTheConnection() case *events.Connected: // Send Status connection.Client.Store.Save(ctx) @@ -127,12 +146,20 @@ func (connection *WhatsappConnection) eventHandler(evt interface{}) { connection.SyncFinished = false case *events.OfflineSyncCompleted: connection.SyncFinished = true + case *events.Receipt: + evt := evt.(*events.Receipt) + // print whole struct + log.Println(evt.Chat.User) + // log.Println(evt.) + + b, _ := json.Marshal(evt) + log.Println(string(b)) default: fmt.Printf("Event Occurred%s\n", reflect.TypeOf(v)) } } -func (connection *WhatsappConnection) SendTextMessage(to []string, msg string) *map[string]interface{} { - response := make(map[string]interface{}) +func (connection *WhatsappConnection) SendTextMessage(to []string, msg string) *map[string]bool { + response := make(map[string]bool) for _, number := range to { IsOnWhatsappCheck, err := connection.Client.IsOnWhatsApp(ctx, []string{"+" + number}) if err != nil { @@ -157,11 +184,11 @@ func (connection *WhatsappConnection) SendTextMessage(to []string, msg string) * fmt.Printf("sending Text To %s\n", number) response[number] = false if len(msg) > 0 { - resp, err := connection.Client.SendMessage(context.Background(), targetJID, &waE2E.Message{ + _, err := connection.Client.SendMessage(context.Background(), targetJID, &waE2E.Message{ Conversation: proto.String(msg), }) if err == nil { - response[number] = resp + response[number] = true } } } diff --git a/go.mod b/go.mod index 2826def..278f3fc 100644 --- a/go.mod +++ b/go.mod @@ -1,157 +1,158 @@ -module github.com/rpsoftech/golang-servers - -go 1.26.0 - -require ( - cloud.google.com/go/firestore v1.21.0 - firebase.google.com/go/v4 v4.19.0 - fyne.io/fyne/v2 v2.7.3 - github.com/fxamacker/cbor/v2 v2.9.0 - github.com/gen2brain/go-fitz v1.24.15 - github.com/go-faker/faker/v4 v4.7.0 - github.com/go-playground/validator/v10 v10.30.1 - github.com/go-sql-driver/mysql v1.9.3 - github.com/go-telegram-bot-api/telegram-bot-api/v5 v5.5.1 - github.com/gofiber/contrib/v3/websocket v1.0.0 - github.com/gofiber/fiber/v2 v2.52.12 - github.com/gofiber/fiber/v3 v3.1.0 - github.com/golang-jwt/jwt/v5 v5.3.1 - github.com/google/uuid v1.6.0 - github.com/gorilla/websocket v1.5.3 - github.com/joho/godotenv v1.5.1 - github.com/mattn/go-sqlite3 v1.14.34 - github.com/mdp/qrterminal/v3 v3.2.1 - github.com/mitchellh/mapstructure v1.5.0 - github.com/prplecake/go-thumbnail v0.1.6 - github.com/redis/go-redis/v9 v9.18.0 - github.com/robfig/cron/v3 v3.0.1 - github.com/rpsoftech/mysqldump v0.0.0-20250611190005-213bcf343081 - github.com/skip2/go-qrcode v0.0.0-20200617195104-da1b6568686e - github.com/surrealdb/surrealdb.go v1.3.0 - go.mau.fi/whatsmeow v0.0.0-20260227112304-c9652e4448a2 - go.mongodb.org/mongo-driver v1.17.9 - golang.org/x/crypto v0.48.0 - golang.org/x/sys v0.41.0 - google.golang.org/api v0.269.0 - google.golang.org/protobuf v1.36.11 -) - -require ( - cel.dev/expr v0.25.1 // indirect - cloud.google.com/go v0.123.0 // indirect - cloud.google.com/go/auth v0.18.2 // indirect - cloud.google.com/go/auth/oauth2adapt v0.2.8 // indirect - cloud.google.com/go/compute/metadata v0.9.0 // indirect - cloud.google.com/go/iam v1.5.3 // indirect - cloud.google.com/go/longrunning v0.8.0 // indirect - cloud.google.com/go/monitoring v1.24.3 // indirect - cloud.google.com/go/storage v1.60.0 // indirect - filippo.io/edwards25519 v1.2.0 // indirect - fyne.io/systray v1.12.0 // indirect - github.com/BurntSushi/toml v1.6.0 // indirect - github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.31.0 // indirect - github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.55.0 // indirect - github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.55.0 // indirect - github.com/MicahParks/keyfunc v1.9.0 // indirect - github.com/andybalholm/brotli v1.2.0 // indirect - github.com/beeper/argo-go v1.1.2 // indirect - github.com/cespare/xxhash/v2 v2.3.0 // indirect - github.com/clipperhouse/uax29/v2 v2.7.0 // indirect - github.com/cncf/xds/go v0.0.0-20260202195803-dba9d589def2 // indirect - github.com/coder/websocket v1.8.14 // indirect - github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect - github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect - github.com/ebitengine/purego v0.10.0 // indirect - github.com/elliotchance/orderedmap/v3 v3.1.0 // indirect - github.com/envoyproxy/go-control-plane/envoy v1.37.0 // indirect - github.com/envoyproxy/protoc-gen-validate v1.3.3 // indirect - github.com/fasthttp/websocket v1.5.12 // indirect - github.com/felixge/httpsnoop v1.0.4 // indirect - github.com/fredbi/uri v1.1.1 // indirect - github.com/fsnotify/fsnotify v1.9.0 // indirect - github.com/fyne-io/gl-js v0.2.0 // indirect - github.com/fyne-io/glfw-js v0.3.0 // indirect - github.com/fyne-io/image v0.1.1 // indirect - github.com/fyne-io/oksvg v0.2.0 // indirect - github.com/gabriel-vasile/mimetype v1.4.13 // indirect - github.com/go-gl/gl v0.0.0-20231021071112-07e5d0ea2e71 // indirect - github.com/go-gl/glfw/v3.3/glfw v0.0.0-20250301202403-da16c1255728 // indirect - github.com/go-jose/go-jose/v4 v4.1.3 // indirect - github.com/go-logr/logr v1.4.3 // indirect - github.com/go-logr/stdr v1.2.2 // indirect - github.com/go-playground/locales v0.14.1 // indirect - github.com/go-playground/universal-translator v0.18.1 // indirect - github.com/go-text/render v0.2.0 // indirect - github.com/go-text/typesetting v0.3.4 // indirect - github.com/godbus/dbus/v5 v5.2.2 // indirect - github.com/gofiber/schema v1.7.0 // indirect - github.com/gofiber/utils/v2 v2.0.2 // indirect - github.com/gofrs/uuid v4.4.0+incompatible // indirect - github.com/golang-jwt/jwt/v4 v4.5.2 // indirect - github.com/golang/protobuf v1.5.4 // indirect - github.com/golang/snappy v1.0.0 // indirect - github.com/google/s2a-go v0.1.9 // indirect - github.com/googleapis/enterprise-certificate-proxy v0.3.12 // indirect - github.com/googleapis/gax-go/v2 v2.17.0 // indirect - github.com/hack-pad/go-indexeddb v0.3.2 // indirect - github.com/hack-pad/safejs v0.1.1 // indirect - github.com/jeandeaual/go-locale v0.0.0-20250612000132-0ef82f21eade // indirect - github.com/jsummers/gobmp v0.0.0-20230614200233-a9de23ed2e25 // indirect - github.com/jupiterrider/ffi v0.6.0 // indirect - github.com/klauspost/compress v1.18.4 // indirect - github.com/leodido/go-urn v1.4.0 // indirect - github.com/mattn/go-colorable v0.1.14 // indirect - github.com/mattn/go-isatty v0.0.20 // indirect - github.com/mattn/go-runewidth v0.0.20 // indirect - github.com/montanaflynn/stats v0.7.1 // indirect - github.com/nfnt/resize v0.0.0-20180221191011-83c6a9932646 // indirect - github.com/nicksnyder/go-i18n/v2 v2.6.1 // indirect - github.com/petermattis/goid v0.0.0-20260226131333-17d1149c6ac6 // indirect - github.com/philhofer/fwd v1.2.0 // indirect - github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 // indirect - github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect - github.com/rs/zerolog v1.34.0 // indirect - github.com/rymdport/portal v0.4.2 // indirect - github.com/savsgio/gotils v0.0.0-20250924091648-bce9a52d7761 // indirect - github.com/spiffe/go-spiffe/v2 v2.6.0 // indirect - github.com/srwiley/oksvg v0.0.0-20221011165216-be6e8873101c // indirect - github.com/srwiley/rasterx v0.0.0-20220730225603-2ab79fcdd4ef // indirect - github.com/stretchr/testify v1.11.1 // indirect - github.com/tinylib/msgp v1.6.3 // indirect - github.com/valyala/bytebufferpool v1.0.0 // indirect - github.com/valyala/fasthttp v1.69.0 // indirect - github.com/vektah/gqlparser/v2 v2.5.32 // indirect - github.com/x448/float16 v0.8.4 // indirect - github.com/xdg-go/pbkdf2 v1.0.0 // indirect - github.com/xdg-go/scram v1.2.0 // indirect - github.com/xdg-go/stringprep v1.0.4 // indirect - github.com/youmark/pkcs8 v0.0.0-20240726163527-a2c0da244d78 // indirect - github.com/yuin/goldmark v1.7.16 // indirect - go.mau.fi/libsignal v0.2.1 // indirect - go.mau.fi/util v0.9.6 // indirect - go.opentelemetry.io/auto/sdk v1.2.1 // indirect - go.opentelemetry.io/contrib/detectors/gcp v1.40.0 // indirect - go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.65.0 // indirect - go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.65.0 // indirect - go.opentelemetry.io/otel v1.40.0 // indirect - go.opentelemetry.io/otel/metric v1.40.0 // indirect - go.opentelemetry.io/otel/sdk v1.40.0 // indirect - go.opentelemetry.io/otel/sdk/metric v1.40.0 // indirect - go.opentelemetry.io/otel/trace v1.40.0 // indirect - go.uber.org/atomic v1.11.0 // indirect - golang.org/x/exp v0.0.0-20260218203240-3dfff04db8fa // indirect - golang.org/x/image v0.36.0 // indirect - golang.org/x/net v0.51.0 // indirect - golang.org/x/oauth2 v0.35.0 // indirect - golang.org/x/sync v0.19.0 // indirect - golang.org/x/term v0.40.0 // indirect - golang.org/x/text v0.34.0 // indirect - golang.org/x/time v0.14.0 // indirect - google.golang.org/appengine/v2 v2.0.6 // indirect - google.golang.org/genproto v0.0.0-20260226221140-a57be14db171 // indirect - google.golang.org/genproto/googleapis/api v0.0.0-20260226221140-a57be14db171 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20260226221140-a57be14db171 // indirect - google.golang.org/grpc v1.79.1 // indirect - gopkg.in/yaml.v3 v3.0.1 // indirect - rsc.io/qr v0.2.0 // indirect -) +module github.com/rpsoftech/golang-servers + +go 1.26.0 + +require ( + cloud.google.com/go/firestore v1.22.0 + firebase.google.com/go/v4 v4.20.0 + fyne.io/fyne/v2 v2.7.4 + github.com/fxamacker/cbor/v2 v2.9.2 + github.com/gen2brain/go-fitz v1.24.15 + github.com/go-faker/faker/v4 v4.7.0 + github.com/go-playground/validator/v10 v10.30.2 + github.com/go-sql-driver/mysql v1.10.0 + github.com/go-telegram-bot-api/telegram-bot-api/v5 v5.5.1 + github.com/gofiber/contrib/v3/websocket v1.1.5 + github.com/gofiber/fiber/v2 v2.52.13 + github.com/gofiber/fiber/v3 v3.3.0 + github.com/golang-jwt/jwt/v5 v5.3.1 + github.com/google/uuid v1.6.0 + github.com/gorilla/websocket v1.5.3 + github.com/joho/godotenv v1.5.1 + github.com/jpillora/chisel v1.11.6 + github.com/mattn/go-sqlite3 v1.14.44 + github.com/mdp/qrterminal/v3 v3.2.1 + github.com/mitchellh/mapstructure v1.5.0 + github.com/prplecake/go-thumbnail v0.1.6 + github.com/redis/go-redis/v9 v9.19.0 + github.com/robfig/cron/v3 v3.0.1 + github.com/rpsoftech/mysqldump v0.0.0-20250611190005-213bcf343081 + github.com/skip2/go-qrcode v0.0.0-20200617195104-da1b6568686e + github.com/surrealdb/surrealdb.go v1.4.0 + go.mau.fi/whatsmeow v0.0.0-20260525123251-933deb5f2ee9 + go.mongodb.org/mongo-driver/v2 v2.6.0 + golang.org/x/crypto v0.52.0 + golang.org/x/sys v0.45.0 + google.golang.org/api v0.280.0 + google.golang.org/protobuf v1.36.11 +) + +require ( + cel.dev/expr v0.25.2 // indirect + cloud.google.com/go v0.123.0 // indirect + cloud.google.com/go/auth v0.20.0 // indirect + cloud.google.com/go/auth/oauth2adapt v0.2.8 // indirect + cloud.google.com/go/compute/metadata v0.9.0 // indirect + cloud.google.com/go/iam v1.11.0 // indirect + cloud.google.com/go/longrunning v1.0.0 // indirect + cloud.google.com/go/monitoring v1.29.0 // indirect + cloud.google.com/go/storage v1.62.2 // indirect + filippo.io/edwards25519 v1.2.0 // indirect + fyne.io/systray v1.12.1 // indirect + github.com/BurntSushi/toml v1.6.0 // indirect + github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.32.0 // indirect + github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.56.0 // indirect + github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.56.0 // indirect + github.com/MicahParks/keyfunc v1.9.0 // indirect + github.com/andybalholm/brotli v1.2.1 // indirect + github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5 // indirect + github.com/beeper/argo-go v1.1.2 // indirect + github.com/cespare/xxhash/v2 v2.3.0 // indirect + github.com/clipperhouse/uax29/v2 v2.7.0 // indirect + github.com/cncf/xds/go v0.0.0-20260202195803-dba9d589def2 // indirect + github.com/coder/websocket v1.8.14 // indirect + github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect + github.com/ebitengine/purego v0.10.1 // indirect + github.com/elliotchance/orderedmap/v3 v3.1.0 // indirect + github.com/envoyproxy/go-control-plane/envoy v1.37.0 // indirect + github.com/envoyproxy/protoc-gen-validate v1.3.3 // indirect + github.com/fasthttp/websocket v1.5.12 // indirect + github.com/felixge/httpsnoop v1.0.4 // indirect + github.com/fredbi/uri v1.1.1 // indirect + github.com/fsnotify/fsnotify v1.10.1 // indirect + github.com/fyne-io/gl-js v0.2.0 // indirect + github.com/fyne-io/glfw-js v0.3.0 // indirect + github.com/fyne-io/image v0.1.1 // indirect + github.com/fyne-io/oksvg v0.2.0 // indirect + github.com/gabriel-vasile/mimetype v1.4.13 // indirect + github.com/go-gl/gl v0.0.0-20260331235117-4566fea9a276 // indirect + github.com/go-gl/glfw/v3.3/glfw v0.0.0-20260406072232-3ac4aa2bb164 // indirect + github.com/go-jose/go-jose/v4 v4.1.4 // indirect + github.com/go-logr/logr v1.4.3 // indirect + github.com/go-logr/stdr v1.2.2 // indirect + github.com/go-playground/locales v0.14.1 // indirect + github.com/go-playground/universal-translator v0.18.1 // indirect + github.com/go-text/render v0.2.1 // indirect + github.com/go-text/typesetting v0.3.4 // indirect + github.com/godbus/dbus/v5 v5.2.2 // indirect + github.com/gofiber/schema v1.7.1 // indirect + github.com/gofiber/utils/v2 v2.0.6 // indirect + github.com/gofrs/uuid v4.4.0+incompatible // indirect + github.com/golang-jwt/jwt/v4 v4.5.2 // indirect + github.com/golang/protobuf v1.5.4 // indirect + github.com/google/s2a-go v0.1.9 // indirect + github.com/googleapis/enterprise-certificate-proxy v0.3.16 // indirect + github.com/googleapis/gax-go/v2 v2.22.0 // indirect + github.com/hack-pad/go-indexeddb v0.3.2 // indirect + github.com/hack-pad/safejs v0.1.1 // indirect + github.com/jeandeaual/go-locale v0.0.0-20250612000132-0ef82f21eade // indirect + github.com/jpillora/backoff v1.0.0 // indirect + github.com/jpillora/sizestr v1.0.0 // indirect + github.com/jsummers/gobmp v0.0.0-20230614200233-a9de23ed2e25 // indirect + github.com/jupiterrider/ffi v0.7.0 // indirect + github.com/klauspost/compress v1.18.6 // indirect + github.com/leodido/go-urn v1.4.0 // indirect + github.com/mattn/go-colorable v0.1.14 // indirect + github.com/mattn/go-isatty v0.0.22 // indirect + github.com/mattn/go-runewidth v0.0.23 // indirect + github.com/nfnt/resize v0.0.0-20180221191011-83c6a9932646 // indirect + github.com/nicksnyder/go-i18n/v2 v2.6.1 // indirect + github.com/petermattis/goid v0.0.0-20260330135022-df67b199bc81 // indirect + github.com/philhofer/fwd v1.2.0 // indirect + github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 // indirect + github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect + github.com/rs/zerolog v1.35.1 // indirect + github.com/rymdport/portal v0.4.2 // indirect + github.com/savsgio/gotils v0.0.0-20250924091648-bce9a52d7761 // indirect + github.com/spiffe/go-spiffe/v2 v2.6.0 // indirect + github.com/srwiley/oksvg v0.0.0-20221011165216-be6e8873101c // indirect + github.com/srwiley/rasterx v0.0.0-20220730225603-2ab79fcdd4ef // indirect + github.com/stretchr/testify v1.11.1 // indirect + github.com/tinylib/msgp v1.6.4 // indirect + github.com/valyala/bytebufferpool v1.0.0 // indirect + github.com/valyala/fasthttp v1.71.0 // indirect + github.com/vektah/gqlparser/v2 v2.5.33 // indirect + github.com/x448/float16 v0.8.4 // indirect + github.com/xdg-go/pbkdf2 v1.0.0 // indirect + github.com/xdg-go/scram v1.2.0 // indirect + github.com/xdg-go/stringprep v1.0.4 // indirect + github.com/youmark/pkcs8 v0.0.0-20240726163527-a2c0da244d78 // indirect + github.com/yuin/goldmark v1.8.2 // indirect + go.mau.fi/libsignal v0.2.1 // indirect + go.mau.fi/util v0.9.9 // indirect + go.opentelemetry.io/auto/sdk v1.2.1 // indirect + go.opentelemetry.io/contrib/detectors/gcp v1.43.0 // indirect + go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.68.0 // indirect + go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.68.0 // indirect + go.opentelemetry.io/otel v1.43.0 // indirect + go.opentelemetry.io/otel/metric v1.43.0 // indirect + go.opentelemetry.io/otel/sdk v1.43.0 // indirect + go.opentelemetry.io/otel/sdk/metric v1.43.0 // indirect + go.opentelemetry.io/otel/trace v1.43.0 // indirect + go.uber.org/atomic v1.11.0 // indirect + golang.org/x/exp v0.0.0-20260508232706-74f9aab9d74a // indirect + golang.org/x/image v0.41.0 // indirect + golang.org/x/net v0.55.0 // indirect + golang.org/x/oauth2 v0.36.0 // indirect + golang.org/x/sync v0.20.0 // indirect + golang.org/x/term v0.43.0 // indirect + golang.org/x/text v0.37.0 // indirect + golang.org/x/time v0.15.0 // indirect + google.golang.org/appengine/v2 v2.0.6 // indirect + google.golang.org/genproto v0.0.0-20260523011958-0a33c5d7ca68 // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20260523011958-0a33c5d7ca68 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20260523011958-0a33c5d7ca68 // indirect + google.golang.org/grpc v1.81.1 // indirect + gopkg.in/yaml.v3 v3.0.1 // indirect + rsc.io/qr v0.2.0 // indirect +) diff --git a/go.sum b/go.sum index 96ee325..910d78f 100644 --- a/go.sum +++ b/go.sum @@ -1,403 +1,394 @@ -cel.dev/expr v0.25.1 h1:1KrZg61W6TWSxuNZ37Xy49ps13NUovb66QLprthtwi4= -cel.dev/expr v0.25.1/go.mod h1:hrXvqGP6G6gyx8UAHSHJ5RGk//1Oj5nXQ2NI02Nrsg4= -cloud.google.com/go v0.123.0 h1:2NAUJwPR47q+E35uaJeYoNhuNEM9kM8SjgRgdeOJUSE= -cloud.google.com/go v0.123.0/go.mod h1:xBoMV08QcqUGuPW65Qfm1o9Y4zKZBpGS+7bImXLTAZU= -cloud.google.com/go/auth v0.18.2 h1:+Nbt5Ev0xEqxlNjd6c+yYUeosQ5TtEUaNcN/3FozlaM= -cloud.google.com/go/auth v0.18.2/go.mod h1:xD+oY7gcahcu7G2SG2DsBerfFxgPAJz17zz2joOFF3M= -cloud.google.com/go/auth/oauth2adapt v0.2.8 h1:keo8NaayQZ6wimpNSmW5OPc283g65QNIiLpZnkHRbnc= -cloud.google.com/go/auth/oauth2adapt v0.2.8/go.mod h1:XQ9y31RkqZCcwJWNSx2Xvric3RrU88hAYYbjDWYDL+c= -cloud.google.com/go/compute/metadata v0.9.0 h1:pDUj4QMoPejqq20dK0Pg2N4yG9zIkYGdBtwLoEkH9Zs= -cloud.google.com/go/compute/metadata v0.9.0/go.mod h1:E0bWwX5wTnLPedCKqk3pJmVgCBSM6qQI1yTBdEb3C10= -cloud.google.com/go/firestore v1.21.0 h1:BhopUsx7kh6NFx77ccRsHhrtkbJUmDAxNY3uapWdjcM= -cloud.google.com/go/firestore v1.21.0/go.mod h1:1xH6HNcnkf/gGyR8udd6pFO4Z7GWJSwLKQMx/u6UrP4= -cloud.google.com/go/iam v1.5.3 h1:+vMINPiDF2ognBJ97ABAYYwRgsaqxPbQDlMnbHMjolc= -cloud.google.com/go/iam v1.5.3/go.mod h1:MR3v9oLkZCTlaqljW6Eb2d3HGDGK5/bDv93jhfISFvU= -cloud.google.com/go/logging v1.13.2 h1:qqlHCBvieJT9Cdq4QqYx1KPadCQ2noD4FK02eNqHAjA= -cloud.google.com/go/logging v1.13.2/go.mod h1:zaybliM3yun1J8mU2dVQ1/qDzjbOqEijZCn6hSBtKak= -cloud.google.com/go/longrunning v0.8.0 h1:LiKK77J3bx5gDLi4SMViHixjD2ohlkwBi+mKA7EhfW8= -cloud.google.com/go/longrunning v0.8.0/go.mod h1:UmErU2Onzi+fKDg2gR7dusz11Pe26aknR4kHmJJqIfk= -cloud.google.com/go/monitoring v1.24.3 h1:dde+gMNc0UhPZD1Azu6at2e79bfdztVDS5lvhOdsgaE= -cloud.google.com/go/monitoring v1.24.3/go.mod h1:nYP6W0tm3N9H/bOw8am7t62YTzZY+zUeQ+Bi6+2eonI= -cloud.google.com/go/storage v1.60.0 h1:oBfZrSOCimggVNz9Y/bXY35uUcts7OViubeddTTVzQ8= -cloud.google.com/go/storage v1.60.0/go.mod h1:q+5196hXfejkctrnx+VYU8RKQr/L3c0cBIlrjmiAKE0= -cloud.google.com/go/trace v1.11.7 h1:kDNDX8JkaAG3R2nq1lIdkb7FCSi1rCmsEtKVsty7p+U= -cloud.google.com/go/trace v1.11.7/go.mod h1:TNn9d5V3fQVf6s4SCveVMIBS2LJUqo73GACmq/Tky0s= -filippo.io/edwards25519 v1.2.0 h1:crnVqOiS4jqYleHd9vaKZ+HKtHfllngJIiOpNpoJsjo= -filippo.io/edwards25519 v1.2.0/go.mod h1:xzAOLCNug/yB62zG1bQ8uziwrIqIuxhctzJT18Q77mc= -firebase.google.com/go/v4 v4.19.0 h1:f5NMlC2YHFsncz00c2+ecBr+ZYlRMhKIhj1z8Iz0lD8= -firebase.google.com/go/v4 v4.19.0/go.mod h1:P7UfBpzc8+Z3MckX79+zsWzKVfpGryr6HLbAe7gCWfs= -fyne.io/fyne/v2 v2.7.3 h1:xBT/iYbdnNHONWO38fZMBrVBiJG8rV/Jypmy4tVfRWE= -fyne.io/fyne/v2 v2.7.3/go.mod h1:gu+dlIcZWSzKZmnrY8Fbnj2Hirabv2ek+AKsfQ2bBlw= -fyne.io/systray v1.12.0 h1:CA1Kk0e2zwFlxtc02L3QFSiIbxJ/P0n582YrZHT7aTM= -fyne.io/systray v1.12.0/go.mod h1:RVwqP9nYMo7h5zViCBHri2FgjXF7H2cub7MAq4NSoLs= -github.com/BurntSushi/toml v1.6.0 h1:dRaEfpa2VI55EwlIW72hMRHdWouJeRF7TPYhI+AUQjk= -github.com/BurntSushi/toml v1.6.0/go.mod h1:ukJfTF/6rtPPRCnwkur4qwRxa8vTRFBF0uk2lLoLwho= -github.com/DATA-DOG/go-sqlmock v1.5.2 h1:OcvFkGmslmlZibjAjaHm3L//6LiuBgolP7OputlJIzU= -github.com/DATA-DOG/go-sqlmock v1.5.2/go.mod h1:88MAG/4G7SMwSE3CeA0ZKzrT5CiOU3OJ+JlNzwDqpNU= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.31.0 h1:DHa2U07rk8syqvCge0QIGMCE1WxGj9njT44GH7zNJLQ= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.31.0/go.mod h1:P4WPRUkOhJC13W//jWpyfJNDAIpvRbAUIYLX/4jtlE0= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.55.0 h1:UnDZ/zFfG1JhH/DqxIZYU/1CUAlTUScoXD/LcM2Ykk8= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.55.0/go.mod h1:IA1C1U7jO/ENqm/vhi7V9YYpBsp+IMyqNrEN94N7tVc= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/cloudmock v0.55.0 h1:7t/qx5Ost0s0wbA/VDrByOooURhp+ikYwv20i9Y07TQ= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/cloudmock v0.55.0/go.mod h1:vB2GH9GAYYJTO3mEn8oYwzEdhlayZIdQz6zdzgUIRvA= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.55.0 h1:0s6TxfCu2KHkkZPnBfsQ2y5qia0jl3MMrmBhu3nCOYk= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.55.0/go.mod h1:Mf6O40IAyB9zR/1J8nGDDPirZQQPbYJni8Yisy7NTMc= -github.com/MicahParks/keyfunc v1.9.0 h1:lhKd5xrFHLNOWrDc4Tyb/Q1AJ4LCzQ48GVJyVIID3+o= -github.com/MicahParks/keyfunc v1.9.0/go.mod h1:IdnCilugA0O/99dW+/MkvlyrsX8+L8+x95xuVNtM5jw= -github.com/agnivade/levenshtein v1.2.1 h1:EHBY3UOn1gwdy/VbFwgo4cxecRznFk7fKWN1KOX7eoM= -github.com/agnivade/levenshtein v1.2.1/go.mod h1:QVVI16kDrtSuwcpd0p1+xMC6Z/VfhtCyDIjcwga4/DU= -github.com/andreyvit/diff v0.0.0-20170406064948-c7f18ee00883 h1:bvNMNQO63//z+xNgfBlViaCIJKLlCJ6/fmUseuG0wVQ= -github.com/andreyvit/diff v0.0.0-20170406064948-c7f18ee00883/go.mod h1:rCTlJbsFo29Kk6CurOXKm700vrz8f0KW0JNfpkRJY/8= -github.com/andybalholm/brotli v1.2.0 h1:ukwgCxwYrmACq68yiUqwIWnGY0cTPox/M94sVwToPjQ= -github.com/andybalholm/brotli v1.2.0/go.mod h1:rzTDkvFWvIrjDXZHkuS16NPggd91W3kUSvPlQ1pLaKY= -github.com/beeper/argo-go v1.1.2 h1:UQI2G8F+NLfGTOmTUI0254pGKx/HUU/etbUGTJv91Fs= -github.com/beeper/argo-go v1.1.2/go.mod h1:M+LJAnyowKVQ6Rdj6XYGEn+qcVFkb3R/MUpqkGR0hM4= -github.com/bsm/ginkgo/v2 v2.12.0 h1:Ny8MWAHyOepLGlLKYmXG4IEkioBysk6GpaRTLC8zwWs= -github.com/bsm/ginkgo/v2 v2.12.0/go.mod h1:SwYbGRRDovPVboqFv0tPTcG1sN61LM1Z4ARdbAV9g4c= -github.com/bsm/gomega v1.27.10 h1:yeMWxP2pV2fG3FgAODIY8EiRE3dy0aeFYt4l7wh6yKA= -github.com/bsm/gomega v1.27.10/go.mod h1:JyEr/xRbxbtgWNi8tIEVPUYZ5Dzef52k01W3YH0H+O0= -github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= -github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/clipperhouse/uax29/v2 v2.7.0 h1:+gs4oBZ2gPfVrKPthwbMzWZDaAFPGYK72F0NJv2v7Vk= -github.com/clipperhouse/uax29/v2 v2.7.0/go.mod h1:EFJ2TJMRUaplDxHKj1qAEhCtQPW2tJSwu5BF98AuoVM= -github.com/cncf/xds/go v0.0.0-20260202195803-dba9d589def2 h1:aBangftG7EVZoUb69Os8IaYg++6uMOdKK83QtkkvJik= -github.com/cncf/xds/go v0.0.0-20260202195803-dba9d589def2/go.mod h1:qwXFYgsP6T7XnJtbKlf1HP8AjxZZyzxMmc+Lq5GjlU4= -github.com/coder/websocket v1.8.14 h1:9L0p0iKiNOibykf283eHkKUHHrpG7f65OE3BhhO7v9g= -github.com/coder/websocket v1.8.14/go.mod h1:NX3SzP+inril6yawo5CQXx8+fk145lPDC6pumgx0mVg= -github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= -github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= -github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f h1:lO4WD4F/rVNCu3HqELle0jiPLLBs70cWOduZpkS1E78= -github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc= -github.com/dolthub/maphash v0.1.0 h1:bsQ7JsF4FkkWyrP3oCnFJgrCUAFbFf3kOl4L/QxPDyQ= -github.com/dolthub/maphash v0.1.0/go.mod h1:gkg4Ch4CdCDu5h6PMriVLawB7koZ+5ijb9puGMV50a4= -github.com/ebitengine/purego v0.10.0 h1:QIw4xfpWT6GWTzaW5XEKy3HXoqrJGx1ijYHzTF0/ISU= -github.com/ebitengine/purego v0.10.0/go.mod h1:iIjxzd6CiRiOG0UyXP+V1+jWqUXVjPKLAI0mRfJZTmQ= -github.com/elliotchance/orderedmap/v3 v3.1.0 h1:j4DJ5ObEmMBt/lcwIecKcoRxIQUEnw0L804lXYDt/pg= -github.com/elliotchance/orderedmap/v3 v3.1.0/go.mod h1:G+Hc2RwaZvJMcS4JpGCOyViCnGeKf0bTYCGTO4uhjSo= -github.com/envoyproxy/go-control-plane v0.14.0 h1:hbG2kr4RuFj222B6+7T83thSPqLjwBIfQawTkC++2HA= -github.com/envoyproxy/go-control-plane v0.14.0/go.mod h1:NcS5X47pLl/hfqxU70yPwL9ZMkUlwlKxtAohpi2wBEU= -github.com/envoyproxy/go-control-plane/envoy v1.37.0 h1:u3riX6BoYRfF4Dr7dwSOroNfdSbEPe9Yyl09/B6wBrQ= -github.com/envoyproxy/go-control-plane/envoy v1.37.0/go.mod h1:DReE9MMrmecPy+YvQOAOHNYMALuowAnbjjEMkkWOi6A= -github.com/envoyproxy/go-control-plane/ratelimit v0.1.0 h1:/G9QYbddjL25KvtKTv3an9lx6VBE2cnb8wp1vEGNYGI= -github.com/envoyproxy/go-control-plane/ratelimit v0.1.0/go.mod h1:Wk+tMFAFbCXaJPzVVHnPgRKdUdwW/KdbRt94AzgRee4= -github.com/envoyproxy/protoc-gen-validate v1.3.3 h1:MVQghNeW+LZcmXe7SY1V36Z+WFMDjpqGAGacLe2T0ds= -github.com/envoyproxy/protoc-gen-validate v1.3.3/go.mod h1:TsndJ/ngyIdQRhMcVVGDDHINPLWB7C82oDArY51KfB0= -github.com/fasthttp/websocket v1.5.12 h1:e4RGPpWW2HTbL3zV0Y/t7g0ub294LkiuXXUuTOUInlE= -github.com/fasthttp/websocket v1.5.12/go.mod h1:I+liyL7/4moHojiOgUOIKEWm9EIxHqxZChS+aMFltyg= -github.com/felixge/fgprof v0.9.3 h1:VvyZxILNuCiUCSXtPtYmmtGvb65nqXh2QFWc0Wpf2/g= -github.com/felixge/fgprof v0.9.3/go.mod h1:RdbpDgzqYVh/T9fPELJyV7EYJuHB55UTEULNun8eiPw= -github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg= -github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= -github.com/fredbi/uri v1.1.1 h1:xZHJC08GZNIUhbP5ImTHnt5Ya0T8FI2VAwI/37kh2Ko= -github.com/fredbi/uri v1.1.1/go.mod h1:4+DZQ5zBjEwQCDmXW5JdIjz0PUA+yJbvtBv+u+adr5o= -github.com/fsnotify/fsnotify v1.9.0 h1:2Ml+OJNzbYCTzsxtv8vKSFD9PbJjmhYF14k/jKC7S9k= -github.com/fsnotify/fsnotify v1.9.0/go.mod h1:8jBTzvmWwFyi3Pb8djgCCO5IBqzKJ/Jwo8TRcHyHii0= -github.com/fxamacker/cbor/v2 v2.9.0 h1:NpKPmjDBgUfBms6tr6JZkTHtfFGcMKsw3eGcmD/sapM= -github.com/fxamacker/cbor/v2 v2.9.0/go.mod h1:vM4b+DJCtHn+zz7h3FFp/hDAI9WNWCsZj23V5ytsSxQ= -github.com/fyne-io/gl-js v0.2.0 h1:+EXMLVEa18EfkXBVKhifYB6OGs3HwKO3lUElA0LlAjs= -github.com/fyne-io/gl-js v0.2.0/go.mod h1:ZcepK8vmOYLu96JoxbCKJy2ybr+g1pTnaBDdl7c3ajI= -github.com/fyne-io/glfw-js v0.3.0 h1:d8k2+Y7l+zy2pc7wlGRyPfTgZoqDf3AI4G+2zOWhWUk= -github.com/fyne-io/glfw-js v0.3.0/go.mod h1:Ri6te7rdZtBgBpxLW19uBpp3Dl6K9K/bRaYdJ22G8Jk= -github.com/fyne-io/image v0.1.1 h1:WH0z4H7qfvNUw5l4p3bC1q70sa5+YWVt6HCj7y4VNyA= -github.com/fyne-io/image v0.1.1/go.mod h1:xrfYBh6yspc+KjkgdZU/ifUC9sPA5Iv7WYUBzQKK7JM= -github.com/fyne-io/oksvg v0.2.0 h1:mxcGU2dx6nwjJsSA9PCYZDuoAcsZ/OuJlvg/Q9Njfo8= -github.com/fyne-io/oksvg v0.2.0/go.mod h1:dJ9oEkPiWhnTFNCmRgEze+YNprJF7YRbpjgpWS4kzoI= -github.com/gabriel-vasile/mimetype v1.4.13 h1:46nXokslUBsAJE/wMsp5gtO500a4F3Nkz9Ufpk2AcUM= -github.com/gabriel-vasile/mimetype v1.4.13/go.mod h1:d+9Oxyo1wTzWdyVUPMmXFvp4F9tea18J8ufA774AB3s= -github.com/gen2brain/go-fitz v1.24.15 h1:sJNB1MOWkqnzzENPHggFpgxTwW0+S5WF/rM5wUBpJWo= -github.com/gen2brain/go-fitz v1.24.15/go.mod h1:SftkiVbTHqF141DuiLwBBM65zP7ig6AVDQpf2WlHamo= -github.com/go-faker/faker/v4 v4.7.0 h1:VboC02cXHl/NuQh5lM2W8b87yp4iFXIu59x4w0RZi4E= -github.com/go-faker/faker/v4 v4.7.0/go.mod h1:u1dIRP5neLB6kTzgyVjdBOV5R1uP7BdxkcWk7tiKQXk= -github.com/go-gl/gl v0.0.0-20231021071112-07e5d0ea2e71 h1:5BVwOaUSBTlVZowGO6VZGw2H/zl9nrd3eCZfYV+NfQA= -github.com/go-gl/gl v0.0.0-20231021071112-07e5d0ea2e71/go.mod h1:9YTyiznxEY1fVinfM7RvRcjRHbw2xLBJ3AAGIT0I4Nw= -github.com/go-gl/glfw/v3.3/glfw v0.0.0-20250301202403-da16c1255728 h1:RkGhqHxEVAvPM0/R+8g7XRwQnHatO0KAuVcwHo8q9W8= -github.com/go-gl/glfw/v3.3/glfw v0.0.0-20250301202403-da16c1255728/go.mod h1:SyRD8YfuKk+ZXlDqYiqe1qMSqjNgtHzBTG810KUagMc= -github.com/go-jose/go-jose/v4 v4.1.3 h1:CVLmWDhDVRa6Mi/IgCgaopNosCaHz7zrMeF9MlZRkrs= -github.com/go-jose/go-jose/v4 v4.1.3/go.mod h1:x4oUasVrzR7071A4TnHLGSPpNOm2a21K9Kf04k1rs08= -github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/logr v1.4.3 h1:CjnDlHq8ikf6E492q6eKboGOC0T8CDaOvkHCIg8idEI= -github.com/go-logr/logr v1.4.3/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= -github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= -github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= -github.com/go-playground/assert/v2 v2.2.0 h1:JvknZsQTYeFEAhQwI4qEt9cyV5ONwRHC+lYKSsYSR8s= -github.com/go-playground/assert/v2 v2.2.0/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= -github.com/go-playground/locales v0.14.1 h1:EWaQ/wswjilfKLTECiXz7Rh+3BjFhfDFKv/oXslEjJA= -github.com/go-playground/locales v0.14.1/go.mod h1:hxrqLVvrK65+Rwrd5Fc6F2O76J/NuW9t0sjnWqG1slY= -github.com/go-playground/universal-translator v0.18.1 h1:Bcnm0ZwsGyWbCzImXv+pAJnYK9S473LQFuzCbDbfSFY= -github.com/go-playground/universal-translator v0.18.1/go.mod h1:xekY+UJKNuX9WP91TpwSH2VMlDf28Uj24BCp08ZFTUY= -github.com/go-playground/validator/v10 v10.30.1 h1:f3zDSN/zOma+w6+1Wswgd9fLkdwy06ntQJp0BBvFG0w= -github.com/go-playground/validator/v10 v10.30.1/go.mod h1:oSuBIQzuJxL//3MelwSLD5hc2Tu889bF0Idm9Dg26cM= -github.com/go-sql-driver/mysql v1.9.3 h1:U/N249h2WzJ3Ukj8SowVFjdtZKfu9vlLZxjPXV1aweo= -github.com/go-sql-driver/mysql v1.9.3/go.mod h1:qn46aNg1333BRMNU69Lq93t8du/dwxI64Gl8i5p1WMU= -github.com/go-telegram-bot-api/telegram-bot-api/v5 v5.5.1 h1:wG8n/XJQ07TmjbITcGiUaOtXxdrINDz1b0J1w0SzqDc= -github.com/go-telegram-bot-api/telegram-bot-api/v5 v5.5.1/go.mod h1:A2S0CWkNylc2phvKXWBBdD3K0iGnDBGbzRpISP2zBl8= -github.com/go-text/render v0.2.0 h1:LBYoTmp5jYiJ4NPqDc2pz17MLmA3wHw1dZSVGcOdeAc= -github.com/go-text/render v0.2.0/go.mod h1:CkiqfukRGKJA5vZZISkjSYrcdtgKQWRa2HIzvwNN5SU= -github.com/go-text/typesetting v0.3.4 h1:YYurUOtEb9kGSOz4uE3k4OpBGsp1dDL8+fjCeaFamAU= -github.com/go-text/typesetting v0.3.4/go.mod h1:4qZCQphq4KSgGTAeI0uMEkVbROgfah8BuyF5LRYr7XY= -github.com/go-text/typesetting-utils v0.0.0-20260223113751-2d88ac90dae3 h1:drBZzMgdYPbmyXqOto4YhhJGrFIQCX94FpR4MzTCsos= -github.com/go-text/typesetting-utils v0.0.0-20260223113751-2d88ac90dae3/go.mod h1:3/62I4La/HBRX9TcTpBj4eipLiwzf+vhI+7whTc9V7o= -github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= -github.com/godbus/dbus/v5 v5.2.2 h1:TUR3TgtSVDmjiXOgAAyaZbYmIeP3DPkld3jgKGV8mXQ= -github.com/godbus/dbus/v5 v5.2.2/go.mod h1:3AAv2+hPq5rdnr5txxxRwiGjPXamgoIHgz9FPBfOp3c= -github.com/gofiber/contrib/v3/websocket v1.0.0 h1:HZNjtiq1HbfTxMOftrwuHtafmwPV8ia2WU2BX0MX7Gg= -github.com/gofiber/contrib/v3/websocket v1.0.0/go.mod h1:h+1Cdn9CRPaF1XBMbmyuhPJuQPo/IXdMrX8YqmLxIFY= -github.com/gofiber/fiber/v2 v2.52.12 h1:0LdToKclcPOj8PktUdIKo9BUohjjwfnQl42Dhw8/WUw= -github.com/gofiber/fiber/v2 v2.52.12/go.mod h1:YEcBbO/FB+5M1IZNBP9FO3J9281zgPAreiI1oqg8nDw= -github.com/gofiber/fiber/v3 v3.1.0 h1:1p4I820pIa+FGxfwWuQZ5rAyX0WlGZbGT6Hnuxt6hKY= -github.com/gofiber/fiber/v3 v3.1.0/go.mod h1:n2nYQovvL9z3Too/FGOfgtERjW3GQcAUqgfoezGBZdU= -github.com/gofiber/schema v1.7.0 h1:yNM+FNRZjyYEli9Ey0AXRBrAY9jTnb+kmGs3lJGPvKg= -github.com/gofiber/schema v1.7.0/go.mod h1:A/X5Ffyru4p9eBdp99qu+nzviHzQiZ7odLT+TwxWhbk= -github.com/gofiber/utils/v2 v2.0.2 h1:ShRRssz0F3AhTlAQcuEj54OEDtWF7+HJDwEi/aa6QLI= -github.com/gofiber/utils/v2 v2.0.2/go.mod h1:+9Ub4NqQ+IaJoTliq5LfdmOJAA/Hzwf4pXOxOa3RrJ0= -github.com/gofrs/uuid v4.4.0+incompatible h1:3qXRTX8/NbyulANqlc0lchS1gqAVxRgsuW1YrTJupqA= -github.com/gofrs/uuid v4.4.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= -github.com/golang-jwt/jwt/v4 v4.4.2/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= -github.com/golang-jwt/jwt/v4 v4.5.2 h1:YtQM7lnr8iZ+j5q71MGKkNw9Mn7AjHM68uc9g5fXeUI= -github.com/golang-jwt/jwt/v4 v4.5.2/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= -github.com/golang-jwt/jwt/v5 v5.3.1 h1:kYf81DTWFe7t+1VvL7eS+jKFVWaUnK9cB1qbwn63YCY= -github.com/golang-jwt/jwt/v5 v5.3.1/go.mod h1:fxCRLWMO43lRc8nhHWY6LGqRcf+1gQWArsqaEUEa5bE= -github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= -github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= -github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= -github.com/golang/snappy v1.0.0 h1:Oy607GVXHs7RtbggtPBnr2RmDArIsAefDwvrdWvRhGs= -github.com/golang/snappy v1.0.0/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= -github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU= -github.com/google/martian/v3 v3.3.3 h1:DIhPTQrbPkgs2yJYdXU/eNACCG5DVQjySNRNlflZ9Fc= -github.com/google/martian/v3 v3.3.3/go.mod h1:iEPrYcgCF7jA9OtScMFQyAlZZ4YXTKEtJ1E6RWzmBA0= -github.com/google/pprof v0.0.0-20211214055906-6f57359322fd h1:1FjCyPC+syAzJ5/2S8fqdZK1R22vvA0J7JZKcuOIQ7Y= -github.com/google/pprof v0.0.0-20211214055906-6f57359322fd/go.mod h1:KgnwoLYCZ8IQu3XUZ8Nc/bM9CCZFOyjUNOSygVozoDg= -github.com/google/s2a-go v0.1.9 h1:LGD7gtMgezd8a/Xak7mEWL0PjoTQFvpRudN895yqKW0= -github.com/google/s2a-go v0.1.9/go.mod h1:YA0Ei2ZQL3acow2O62kdp9UlnvMmU7kA6Eutn0dXayM= -github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= -github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/googleapis/enterprise-certificate-proxy v0.3.12 h1:Fg+zsqzYEs1ZnvmcztTYxhgCBsx3eEhEwQ1W/lHq/sQ= -github.com/googleapis/enterprise-certificate-proxy v0.3.12/go.mod h1:vqVt9yG9480NtzREnTlmGSBmFrA+bzb0yl0TxoBQXOg= -github.com/googleapis/gax-go/v2 v2.17.0 h1:RksgfBpxqff0EZkDWYuz9q/uWsTVz+kf43LsZ1J6SMc= -github.com/googleapis/gax-go/v2 v2.17.0/go.mod h1:mzaqghpQp4JDh3HvADwrat+6M3MOIDp5YKHhb9PAgDY= -github.com/gorilla/websocket v1.5.3 h1:saDtZ6Pbx/0u+bgYQ3q96pZgCzfhKXGPqt7kZ72aNNg= -github.com/gorilla/websocket v1.5.3/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= -github.com/hack-pad/go-indexeddb v0.3.2 h1:DTqeJJYc1usa45Q5r52t01KhvlSN02+Oq+tQbSBI91A= -github.com/hack-pad/go-indexeddb v0.3.2/go.mod h1:QvfTevpDVlkfomY498LhstjwbPW6QC4VC/lxYb0Kom0= -github.com/hack-pad/safejs v0.1.1 h1:d5qPO0iQ7h2oVtpzGnLExE+Wn9AtytxIfltcS2b9KD8= -github.com/hack-pad/safejs v0.1.1/go.mod h1:HdS+bKF1NrE72VoXZeWzxFOVQVUSqZJAG0xNCnb+Tio= -github.com/jeandeaual/go-locale v0.0.0-20250612000132-0ef82f21eade h1:FmusiCI1wHw+XQbvL9M+1r/C3SPqKrmBaIOYwVfQoDE= -github.com/jeandeaual/go-locale v0.0.0-20250612000132-0ef82f21eade/go.mod h1:ZDXo8KHryOWSIqnsb/CiDq7hQUYryCgdVnxbj8tDG7o= -github.com/joho/godotenv v1.5.1 h1:7eLL/+HRGLY0ldzfGMeQkb7vMd0as4CfYvUVzLqw0N0= -github.com/joho/godotenv v1.5.1/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4= -github.com/jsummers/gobmp v0.0.0-20230614200233-a9de23ed2e25 h1:YLvr1eE6cdCqjOe972w/cYF+FjW34v27+9Vo5106B4M= -github.com/jsummers/gobmp v0.0.0-20230614200233-a9de23ed2e25/go.mod h1:kLgvv7o6UM+0QSf0QjAse3wReFDsb9qbZJdfexWlrQw= -github.com/jupiterrider/ffi v0.6.0 h1:UX378KcZvH5c8qgLi9KL/bL82SZTHdRspZ+jj7bvBng= -github.com/jupiterrider/ffi v0.6.0/go.mod h1:PqZ5Go6X9by8CIXgfprxfMPYmn8oT5m2O7AA56s64bY= -github.com/klauspost/compress v1.18.4 h1:RPhnKRAQ4Fh8zU2FY/6ZFDwTVTxgJ/EMydqSTzE9a2c= -github.com/klauspost/compress v1.18.4/go.mod h1:R0h/fSBs8DE4ENlcrlib3PsXS61voFxhIs2DeRhCvJ4= -github.com/klauspost/cpuid/v2 v2.0.9 h1:lgaqFMSdTdQYdZ04uHyN2d/eKdOMyi2YLSvlQIBFYa4= -github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= -github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= -github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= -github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= -github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= -github.com/leodido/go-urn v1.4.0 h1:WT9HwE9SGECu3lg4d/dIA+jxlljEa1/ffXKmRjqdmIQ= -github.com/leodido/go-urn v1.4.0/go.mod h1:bvxc+MVxLKB4z00jd1z+Dvzr47oO32F/QSNjSBOlFxI= -github.com/lxzan/gws v1.8.9 h1:VU3SGUeWlQrEwfUSfokcZep8mdg/BrUF+y73YYshdBM= -github.com/lxzan/gws v1.8.9/go.mod h1:d9yHaR1eDTBHagQC6KY7ycUOaz5KWeqQtP3xu7aMK8Y= -github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= -github.com/mattn/go-colorable v0.1.14 h1:9A9LHSqF/7dyVVX6g0U9cwm9pG3kP9gSzcuIPHPsaIE= -github.com/mattn/go-colorable v0.1.14/go.mod h1:6LmQG8QLFO4G5z1gPvYEzlUgJ2wF+stgPZH1UqBm1s8= -github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= -github.com/mattn/go-isatty v0.0.19/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= -github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= -github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= -github.com/mattn/go-runewidth v0.0.20 h1:WcT52H91ZUAwy8+HUkdM3THM6gXqXuLJi9O3rjcQQaQ= -github.com/mattn/go-runewidth v0.0.20/go.mod h1:XBkDxAl56ILZc9knddidhrOlY5R/pDhgLpndooCuJAs= -github.com/mattn/go-sqlite3 v1.14.34 h1:3NtcvcUnFBPsuRcno8pUtupspG/GM+9nZ88zgJcp6Zk= -github.com/mattn/go-sqlite3 v1.14.34/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= -github.com/mdp/qrterminal/v3 v3.2.1 h1:6+yQjiiOsSuXT5n9/m60E54vdgFsw0zhADHhHLrFet4= -github.com/mdp/qrterminal/v3 v3.2.1/go.mod h1:jOTmXvnBsMy5xqLniO0R++Jmjs2sTm9dFSuQ5kpz/SU= -github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= -github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= -github.com/montanaflynn/stats v0.7.1 h1:etflOAAHORrCC44V+aR6Ftzort912ZU+YLiSTuV8eaE= -github.com/montanaflynn/stats v0.7.1/go.mod h1:etXPPgVO6n31NxCd9KQUMvCM+ve0ruNzt6R8Bnaayow= -github.com/nfnt/resize v0.0.0-20180221191011-83c6a9932646 h1:zYyBkD/k9seD2A7fsi6Oo2LfFZAehjjQMERAvZLEDnQ= -github.com/nfnt/resize v0.0.0-20180221191011-83c6a9932646/go.mod h1:jpp1/29i3P1S/RLdc7JQKbRpFeM1dOBd8T9ki5s+AY8= -github.com/nicksnyder/go-i18n/v2 v2.6.1 h1:JDEJraFsQE17Dut9HFDHzCoAWGEQJom5s0TRd17NIEQ= -github.com/nicksnyder/go-i18n/v2 v2.6.1/go.mod h1:Vee0/9RD3Quc/NmwEjzzD7VTZ+Ir7QbXocrkhOzmUKA= -github.com/petermattis/goid v0.0.0-20260226131333-17d1149c6ac6 h1:rh2lKw/P/EqHa724vYH2+VVQ1YnW4u6EOXl0PMAovZE= -github.com/petermattis/goid v0.0.0-20260226131333-17d1149c6ac6/go.mod h1:pxMtw7cyUw6B2bRH0ZBANSPg+AoSud1I1iyJHI69jH4= -github.com/philhofer/fwd v1.2.0 h1:e6DnBTl7vGY+Gz322/ASL4Gyp1FspeMvx1RNDoToZuM= -github.com/philhofer/fwd v1.2.0/go.mod h1:RqIHx9QI14HlwKwm98g9Re5prTQ6LdeRQn+gXJFxsJM= -github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/profile v1.7.0 h1:hnbDkaNWPCLMO9wGLdBFTIZvzDrDfBM2072E1S9gJkA= -github.com/pkg/profile v1.7.0/go.mod h1:8Uer0jas47ZQMJ7VD+OHknK4YDY07LPUC6dEvqDjvNo= -github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 h1:GFCKgmp0tecUJ0sJuv4pzYCqS9+RGSn52M3FUwPs+uo= -github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10/go.mod h1:t/avpk3KcrXxUnYOhZhMXJlSEyie6gQbtLq5NM3loB8= -github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= -github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/prplecake/go-thumbnail v0.1.6 h1:6mBLXL2/79QHYRCvrciiLtT6vAJfOaMAvNhmjsyLX1c= -github.com/prplecake/go-thumbnail v0.1.6/go.mod h1:v8PaF1YrWlJjdkROeoDgDil5nFycVdH7taPOl/NS830= -github.com/redis/go-redis/v9 v9.18.0 h1:pMkxYPkEbMPwRdenAzUNyFNrDgHx9U+DrBabWNfSRQs= -github.com/redis/go-redis/v9 v9.18.0/go.mod h1:k3ufPphLU5YXwNTUcCRXGxUoF1fqxnhFQmscfkCoDA0= -github.com/robfig/cron/v3 v3.0.1 h1:WdRxkvbJztn8LMz/QEvLN5sBU+xKpSqwwUO1Pjr4qDs= -github.com/robfig/cron/v3 v3.0.1/go.mod h1:eQICP3HwyT7UooqI/z+Ov+PtYAWygg1TEWWzGIFLtro= -github.com/rogpeppe/go-internal v1.14.1 h1:UQB4HGPB6osV0SQTLymcB4TgvyWu6ZyliaW0tI/otEQ= -github.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7so1lCWt35ZSgc= -github.com/rpsoftech/mysqldump v0.0.0-20250611190005-213bcf343081 h1:BhhQEZcCQNHuJ80dzWHzmroYro0rvijuPaIM12atvNg= -github.com/rpsoftech/mysqldump v0.0.0-20250611190005-213bcf343081/go.mod h1:r/BoxnMDP7PN0Hbyysah74N/VHbv6KrnIZ6f7fRsljk= -github.com/rs/xid v1.6.0/go.mod h1:7XoLgs4eV+QndskICGsho+ADou8ySMSjJKDIan90Nz0= -github.com/rs/zerolog v1.34.0 h1:k43nTLIwcTVQAncfCw4KZ2VY6ukYoZaBPNOE8txlOeY= -github.com/rs/zerolog v1.34.0/go.mod h1:bJsvje4Z08ROH4Nhs5iH600c3IkWhwp44iRc54W6wYQ= -github.com/rymdport/portal v0.4.2 h1:7jKRSemwlTyVHHrTGgQg7gmNPJs88xkbKcIL3NlcmSU= -github.com/rymdport/portal v0.4.2/go.mod h1:kFF4jslnJ8pD5uCi17brj/ODlfIidOxlgUDTO5ncnC4= -github.com/savsgio/gotils v0.0.0-20250924091648-bce9a52d7761 h1:McifyVxygw1d67y6vxUqls2D46J8W9nrki9c8c0eVvE= -github.com/savsgio/gotils v0.0.0-20250924091648-bce9a52d7761/go.mod h1:Vi9gvHvTw4yCUHIznFl5TPULS7aXwgaTByGeBY75Wko= -github.com/sergi/go-diff v1.3.1 h1:xkr+Oxo4BOQKmkn/B9eMK0g5Kg/983T9DqqPHwYqD+8= -github.com/sergi/go-diff v1.3.1/go.mod h1:aMJSSKb2lpPvRNec0+w3fl7LP9IOFzdc9Pa4NFbPK1I= -github.com/shamaton/msgpack/v3 v3.1.0 h1:jsk0vEAqVvvS9+fTZ5/EcQ9tz860c9pWxJ4Iwecz8gU= -github.com/shamaton/msgpack/v3 v3.1.0/go.mod h1:DcQG8jrdrQCIxr3HlMYkiXdMhK+KfN2CitkyzsQV4uc= -github.com/skip2/go-qrcode v0.0.0-20200617195104-da1b6568686e h1:MRM5ITcdelLK2j1vwZ3Je0FKVCfqOLp5zO6trqMLYs0= -github.com/skip2/go-qrcode v0.0.0-20200617195104-da1b6568686e/go.mod h1:XV66xRDqSt+GTGFMVlhk3ULuV0y9ZmzeVGR4mloJI3M= -github.com/spiffe/go-spiffe/v2 v2.6.0 h1:l+DolpxNWYgruGQVV0xsfeya3CsC7m8iBzDnMpsbLuo= -github.com/spiffe/go-spiffe/v2 v2.6.0/go.mod h1:gm2SeUoMZEtpnzPNs2Csc0D/gX33k1xIx7lEzqblHEs= -github.com/srwiley/oksvg v0.0.0-20221011165216-be6e8873101c h1:km8GpoQut05eY3GiYWEedbTT0qnSxrCjsVbb7yKY1KE= -github.com/srwiley/oksvg v0.0.0-20221011165216-be6e8873101c/go.mod h1:cNQ3dwVJtS5Hmnjxy6AgTPd0Inb3pW05ftPSX7NZO7Q= -github.com/srwiley/rasterx v0.0.0-20220730225603-2ab79fcdd4ef h1:Ch6Q+AZUxDBCVqdkI8FSpFyZDtCVBc2VmejdNrm5rRQ= -github.com/srwiley/rasterx v0.0.0-20220730225603-2ab79fcdd4ef/go.mod h1:nXTWP6+gD5+LUJ8krVhhoeHjvHTutPxMYl5SvkcnJNE= -github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U= -github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U= -github.com/surrealdb/surrealdb.go v1.3.0 h1:/ccM9zQnx+SXYjQh1eFxcc0UagDd3VDHNUzmbyU/QEc= -github.com/surrealdb/surrealdb.go v1.3.0/go.mod h1:ju3vn9OHXde9Ulvc7/fP9I8ylkiapOdBSdrEs2PmTtA= -github.com/tinylib/msgp v1.6.3 h1:bCSxiTz386UTgyT1i0MSCvdbWjVW+8sG3PjkGsZQt4s= -github.com/tinylib/msgp v1.6.3/go.mod h1:RSp0LW9oSxFut3KzESt5Voq4GVWyS+PSulT77roAqEA= -github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw= -github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= -github.com/valyala/fasthttp v1.69.0 h1:fNLLESD2SooWeh2cidsuFtOcrEi4uB4m1mPrkJMZyVI= -github.com/valyala/fasthttp v1.69.0/go.mod h1:4wA4PfAraPlAsJ5jMSqCE2ug5tqUPwKXxVj8oNECGcw= -github.com/vektah/gqlparser/v2 v2.5.32 h1:k9QPJd4sEDTL+qB4ncPLflqTJ3MmjB9SrVzJrawpFSc= -github.com/vektah/gqlparser/v2 v2.5.32/go.mod h1:c1I28gSOVNzlfc4WuDlqU7voQnsqI6OG2amkBAFmgts= -github.com/x448/float16 v0.8.4 h1:qLwI1I70+NjRFUR3zs1JPUCgaCXSh3SW62uAKT1mSBM= -github.com/x448/float16 v0.8.4/go.mod h1:14CWIYCyZA/cWjXOioeEpHeN/83MdbZDRQHoFcYsOfg= -github.com/xdg-go/pbkdf2 v1.0.0 h1:Su7DPu48wXMwC3bs7MCNG+z4FhcyEuz5dlvchbq0B0c= -github.com/xdg-go/pbkdf2 v1.0.0/go.mod h1:jrpuAogTd400dnrH08LKmI/xc1MbPOebTwRqcT5RDeI= -github.com/xdg-go/scram v1.2.0 h1:bYKF2AEwG5rqd1BumT4gAnvwU/M9nBp2pTSxeZw7Wvs= -github.com/xdg-go/scram v1.2.0/go.mod h1:3dlrS0iBaWKYVt2ZfA4cj48umJZ+cAEbR6/SjLA88I8= -github.com/xdg-go/stringprep v1.0.4 h1:XLI/Ng3O1Atzq0oBs3TWm+5ZVgkq2aqdlvP9JtoZ6c8= -github.com/xdg-go/stringprep v1.0.4/go.mod h1:mPGuuIYwz7CmR2bT9j4GbQqutWS1zV24gijq1dTyGkM= -github.com/xyproto/randomstring v1.0.5 h1:YtlWPoRdgMu3NZtP45drfy1GKoojuR7hmRcnhZqKjWU= -github.com/xyproto/randomstring v1.0.5/go.mod h1:rgmS5DeNXLivK7YprL0pY+lTuhNQW3iGxZ18UQApw/E= -github.com/youmark/pkcs8 v0.0.0-20240726163527-a2c0da244d78 h1:ilQV1hzziu+LLM3zUTJ0trRztfwgjqKnBWNtSRkbmwM= -github.com/youmark/pkcs8 v0.0.0-20240726163527-a2c0da244d78/go.mod h1:aL8wCCfTfSfmXjznFBSZNN13rSJjlIOI1fUNAtF7rmI= -github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= -github.com/yuin/goldmark v1.7.16 h1:n+CJdUxaFMiDUNnWC3dMWCIQJSkxH4uz3ZwQBkAlVNE= -github.com/yuin/goldmark v1.7.16/go.mod h1:ip/1k0VRfGynBgxOz0yCqHrbZXhcjxyuS66Brc7iBKg= -github.com/zeebo/xxh3 v1.0.2 h1:xZmwmqxHZA8AI603jOQ0tMqmBr9lPeFwGg6d+xy9DC0= -github.com/zeebo/xxh3 v1.0.2/go.mod h1:5NWz9Sef7zIDm2JHfFlcQvNekmcEl9ekUZQQKCYaDcA= -go.mau.fi/libsignal v0.2.1 h1:vRZG4EzTn70XY6Oh/pVKrQGuMHBkAWlGRC22/85m9L0= -go.mau.fi/libsignal v0.2.1/go.mod h1:iVvjrHyfQqWajOUaMEsIfo3IqgVMrhWcPiiEzk7NgoU= -go.mau.fi/util v0.9.6 h1:2nsvxm49KhI3wrFltr0+wSUBlnQ4CMtykuELjpIU+ts= -go.mau.fi/util v0.9.6/go.mod h1:sIJpRH7Iy5Ad1SBuxQoatxtIeErgzxCtjd/2hCMkYMI= -go.mau.fi/whatsmeow v0.0.0-20260227112304-c9652e4448a2 h1:tYSfEoDVfPEWWuNgbYzyaX6TmWwlplW6NktbaGsVAb0= -go.mau.fi/whatsmeow v0.0.0-20260227112304-c9652e4448a2/go.mod h1:mXCRFyPEPn4jqWz6Afirn8vY7DpHCPnlKq6I2cWwFHM= -go.mongodb.org/mongo-driver v1.17.9 h1:IexDdCuuNJ3BHrELgBlyaH9p60JXAvdzWR128q+U5tU= -go.mongodb.org/mongo-driver v1.17.9/go.mod h1:LlOhpH5NUEfhxcAwG0UEkMqwYcc4JU18gtCdGudk/tQ= -go.opentelemetry.io/auto/sdk v1.2.1 h1:jXsnJ4Lmnqd11kwkBV2LgLoFMZKizbCi5fNZ/ipaZ64= -go.opentelemetry.io/auto/sdk v1.2.1/go.mod h1:KRTj+aOaElaLi+wW1kO/DZRXwkF4C5xPbEe3ZiIhN7Y= -go.opentelemetry.io/contrib/detectors/gcp v1.40.0 h1:Awaf8gmW99tZTOWqkLCOl6aw1/rxAWVlHsHIZ3fT2sA= -go.opentelemetry.io/contrib/detectors/gcp v1.40.0/go.mod h1:99OY9ZCqyLkzJLTh5XhECpLRSxcZl+ZDKBEO+jMBFR4= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.65.0 h1:XmiuHzgJt067+a6kwyAzkhXooYVv3/TOw9cM2VfJgUM= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.65.0/go.mod h1:KDgtbWKTQs4bM+VPUr6WlL9m/WXcmkCcBlIzqxPGzmI= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.65.0 h1:7iP2uCb7sGddAr30RRS6xjKy7AZ2JtTOPA3oolgVSw8= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.65.0/go.mod h1:c7hN3ddxs/z6q9xwvfLPk+UHlWRQyaeR1LdgfL/66l0= -go.opentelemetry.io/otel v1.40.0 h1:oA5YeOcpRTXq6NN7frwmwFR0Cn3RhTVZvXsP4duvCms= -go.opentelemetry.io/otel v1.40.0/go.mod h1:IMb+uXZUKkMXdPddhwAHm6UfOwJyh4ct1ybIlV14J0g= -go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.39.0 h1:5gn2urDL/FBnK8OkCfD1j3/ER79rUuTYmCvlXBKeYL8= -go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.39.0/go.mod h1:0fBG6ZJxhqByfFZDwSwpZGzJU671HkwpWaNe2t4VUPI= -go.opentelemetry.io/otel/metric v1.40.0 h1:rcZe317KPftE2rstWIBitCdVp89A2HqjkxR3c11+p9g= -go.opentelemetry.io/otel/metric v1.40.0/go.mod h1:ib/crwQH7N3r5kfiBZQbwrTge743UDc7DTFVZrrXnqc= -go.opentelemetry.io/otel/sdk v1.40.0 h1:KHW/jUzgo6wsPh9At46+h4upjtccTmuZCFAc9OJ71f8= -go.opentelemetry.io/otel/sdk v1.40.0/go.mod h1:Ph7EFdYvxq72Y8Li9q8KebuYUr2KoeyHx0DRMKrYBUE= -go.opentelemetry.io/otel/sdk/metric v1.40.0 h1:mtmdVqgQkeRxHgRv4qhyJduP3fYJRMX4AtAlbuWdCYw= -go.opentelemetry.io/otel/sdk/metric v1.40.0/go.mod h1:4Z2bGMf0KSK3uRjlczMOeMhKU2rhUqdWNoKcYrtcBPg= -go.opentelemetry.io/otel/trace v1.40.0 h1:WA4etStDttCSYuhwvEa8OP8I5EWu24lkOzp+ZYblVjw= -go.opentelemetry.io/otel/trace v1.40.0/go.mod h1:zeAhriXecNGP/s2SEG3+Y8X9ujcJOTqQ5RgdEJcawiA= -go.uber.org/atomic v1.11.0 h1:ZvwS0R+56ePWxUNi+Atn9dWONBPp/AUETXlHW0DxSjE= -go.uber.org/atomic v1.11.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0= -go.yaml.in/yaml/v3 v3.0.4 h1:tfq32ie2Jv2UxXFdLJdh3jXuOzWiL1fo0bu/FbuKpbc= -go.yaml.in/yaml/v3 v3.0.4/go.mod h1:DhzuOOF2ATzADvBadXxruRBLzYTpT36CKvDb3+aBEFg= -golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.48.0 h1:/VRzVqiRSggnhY7gNRxPauEQ5Drw9haKdM0jqfcCFts= -golang.org/x/crypto v0.48.0/go.mod h1:r0kV5h3qnFPlQnBSrULhlsRfryS2pmewsg+XfMgkVos= -golang.org/x/exp v0.0.0-20260218203240-3dfff04db8fa h1:Zt3DZoOFFYkKhDT3v7Lm9FDMEV06GpzjG2jrqW+QTE0= -golang.org/x/exp v0.0.0-20260218203240-3dfff04db8fa/go.mod h1:K79w1Vqn7PoiZn+TkNpx3BUWUQksGO3JcVX6qIjytmA= -golang.org/x/image v0.0.0-20220302094943-723b81ca9867/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM= -golang.org/x/image v0.36.0 h1:Iknbfm1afbgtwPTmHnS2gTM/6PPZfH+z2EFuOkSbqwc= -golang.org/x/image v0.36.0/go.mod h1:YsWD2TyyGKiIX1kZlu9QfKIsQ4nAAK9bdgdrIsE7xy4= -golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= -golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.51.0 h1:94R/GTO7mt3/4wIKpcR5gkGmRLOuE/2hNGeWq/GBIFo= -golang.org/x/net v0.51.0/go.mod h1:aamm+2QF5ogm02fjy5Bb7CQ0WMt1/WVM7FtyaTLlA9Y= -golang.org/x/oauth2 v0.35.0 h1:Mv2mzuHuZuY2+bkyWXIHMfhNdJAdwW3FuWeCPYN5GVQ= -golang.org/x/oauth2 v0.35.0/go.mod h1:lzm5WQJQwKZ3nwavOZ3IS5Aulzxi68dUSgRHujetwEA= -golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.19.0 h1:vV+1eWNmZ5geRlYjzm2adRgW2/mcpevXNg50YZtPCE4= -golang.org/x/sync v0.19.0/go.mod h1:9KTHXmSnoGruLpwFjVSX0lNNA75CykiMECbovNTZqGI= -golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.41.0 h1:Ivj+2Cp/ylzLiEU89QhWblYnOE9zerudt9Ftecq2C6k= -golang.org/x/sys v0.41.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= -golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= -golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/term v0.40.0 h1:36e4zGLqU4yhjlmxEaagx2KuYbJq3EwY8K943ZsHcvg= -golang.org/x/term v0.40.0/go.mod h1:w2P8uVp06p2iyKKuvXIm7N/y0UCRt3UfJTfZ7oOpglM= -golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ= -golang.org/x/text v0.34.0 h1:oL/Qq0Kdaqxa1KbNeMKwQq0reLCCaFtqu2eNuSeNHbk= -golang.org/x/text v0.34.0/go.mod h1:homfLqTYRFyVYemLBFl5GgL/DWEiH5wcsQ5gSh1yziA= -golang.org/x/time v0.14.0 h1:MRx4UaLrDotUKUdCIqzPC48t1Y9hANFKIRpNx+Te8PI= -golang.org/x/time v0.14.0/go.mod h1:eL/Oa2bBBK0TkX57Fyni+NgnyQQN4LitPmob2Hjnqw4= -golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= -golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -gonum.org/v1/gonum v0.16.0 h1:5+ul4Swaf3ESvrOnidPp4GZbzf0mxVQpDCYUQE7OJfk= -gonum.org/v1/gonum v0.16.0/go.mod h1:fef3am4MQ93R2HHpKnLk4/Tbh/s0+wqD5nfa6Pnwy4E= -google.golang.org/api v0.269.0 h1:qDrTOxKUQ/P0MveH6a7vZ+DNHxJQjtGm/uvdbdGXCQg= -google.golang.org/api v0.269.0/go.mod h1:N8Wpcu23Tlccl0zSHEkcAZQKDLdquxK+l9r2LkwAauE= -google.golang.org/appengine v1.6.8 h1:IhEN5q69dyKagZPYMSdIjS2HqprW324FRQZJcGqPAsM= -google.golang.org/appengine/v2 v2.0.6 h1:LvPZLGuchSBslPBp+LAhihBeGSiRh1myRoYK4NtuBIw= -google.golang.org/appengine/v2 v2.0.6/go.mod h1:WoEXGoXNfa0mLvaH5sV3ZSGXwVmy8yf7Z1JKf3J3wLI= -google.golang.org/genproto v0.0.0-20260226221140-a57be14db171 h1:RxhCsti413yL0IjU9dVvuTbCISo8gs3RW1jPMStck+4= -google.golang.org/genproto v0.0.0-20260226221140-a57be14db171/go.mod h1:uhvzakVEqAuXU3TC2JCsxIRe5f77l+JySE3EqPoMyqM= -google.golang.org/genproto/googleapis/api v0.0.0-20260226221140-a57be14db171 h1:tu/dtnW1o3wfaxCOjSLn5IRX4YDcJrtlpzYkhHhGaC4= -google.golang.org/genproto/googleapis/api v0.0.0-20260226221140-a57be14db171/go.mod h1:M5krXqk4GhBKvB596udGL3UyjL4I1+cTbK0orROM9ng= -google.golang.org/genproto/googleapis/rpc v0.0.0-20260226221140-a57be14db171 h1:ggcbiqK8WWh6l1dnltU4BgWGIGo+EVYxCaAPih/zQXQ= -google.golang.org/genproto/googleapis/rpc v0.0.0-20260226221140-a57be14db171/go.mod h1:4Hqkh8ycfw05ld/3BWL7rJOSfebL2Q+DVDeRgYgxUU8= -google.golang.org/grpc v1.79.1 h1:zGhSi45ODB9/p3VAawt9a+O/MULLl9dpizzNNpq7flY= -google.golang.org/grpc v1.79.1/go.mod h1:KmT0Kjez+0dde/v2j9vzwoAScgEPx/Bw1CYChhHLrHQ= -google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= -google.golang.org/protobuf v1.30.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= -google.golang.org/protobuf v1.36.11 h1:fV6ZwhNocDyBLK0dj+fg8ektcVegBBuEolpbTQyBNVE= -google.golang.org/protobuf v1.36.11/go.mod h1:HTf+CrKn2C3g5S8VImy6tdcUvCska2kB7j23XfzDpco= -gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= -gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= -gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= -gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -rsc.io/qr v0.2.0 h1:6vBLea5/NRMVTz8V66gipeLycZMl/+UlFmk8DvqQ6WY= -rsc.io/qr v0.2.0/go.mod h1:IF+uZjkb9fqyeF/4tlBoynqmQxUoPfWEKh921coOuXs= +cel.dev/expr v0.25.2 h1:K6j46C81hXtZQfuX60cVWQFBJahKSE2gfRbNuvr5bFs= +cel.dev/expr v0.25.2/go.mod h1:hrXvqGP6G6gyx8UAHSHJ5RGk//1Oj5nXQ2NI02Nrsg4= +cloud.google.com/go v0.123.0 h1:2NAUJwPR47q+E35uaJeYoNhuNEM9kM8SjgRgdeOJUSE= +cloud.google.com/go v0.123.0/go.mod h1:xBoMV08QcqUGuPW65Qfm1o9Y4zKZBpGS+7bImXLTAZU= +cloud.google.com/go/auth v0.20.0 h1:kXTssoVb4azsVDoUiF8KvxAqrsQcQtB53DcSgta74CA= +cloud.google.com/go/auth v0.20.0/go.mod h1:942/yi/itH1SsmpyrbnTMDgGfdy2BUqIKyd0cyYLc5Q= +cloud.google.com/go/auth/oauth2adapt v0.2.8 h1:keo8NaayQZ6wimpNSmW5OPc283g65QNIiLpZnkHRbnc= +cloud.google.com/go/auth/oauth2adapt v0.2.8/go.mod h1:XQ9y31RkqZCcwJWNSx2Xvric3RrU88hAYYbjDWYDL+c= +cloud.google.com/go/compute/metadata v0.9.0 h1:pDUj4QMoPejqq20dK0Pg2N4yG9zIkYGdBtwLoEkH9Zs= +cloud.google.com/go/compute/metadata v0.9.0/go.mod h1:E0bWwX5wTnLPedCKqk3pJmVgCBSM6qQI1yTBdEb3C10= +cloud.google.com/go/firestore v1.22.0 h1:avooeboIq37vKXobrbPUFhFBxS/c3FqmWoX0xs8dO6E= +cloud.google.com/go/firestore v1.22.0/go.mod h1:PaM4i7i7ruALSKmlpHXXZaPObcZw0W7ie5UOPr72iTU= +cloud.google.com/go/iam v1.11.0 h1:KieQ9Pb+LLPak1O3Rv3GgCxhnmkYf7Xyh0P5HfF1jFM= +cloud.google.com/go/iam v1.11.0/go.mod h1:KP+nKGugNJW4LcLx1uEZcq1ok5sQHFaQehQNl4QDgV4= +cloud.google.com/go/logging v1.18.0 h1:KhzZq+1cSkPH9YUaKLLhLtQxIHitVayBmk0sGfoM9+k= +cloud.google.com/go/logging v1.18.0/go.mod h1:ZGKnpBaURITh+g/uom2VhbiFoFWvejcrHPDhxFtU/gI= +cloud.google.com/go/longrunning v1.0.0 h1:lwzWEYD8+NkYV7dhexOz6kmlvajZA70+bW/xMhRVVdY= +cloud.google.com/go/longrunning v1.0.0/go.mod h1:8nqFBPOO1U/XkhWl0I19AMZEphrHi73VNABIpKYaTwM= +cloud.google.com/go/monitoring v1.29.0 h1:AHhDsFaSax1/4k+qlIDX/SDGe6hggnfXJ9dkgD9qBPY= +cloud.google.com/go/monitoring v1.29.0/go.mod h1:72NOVjJXHY/HBfoLT0+qlCZBT059+9VXLeAnL2PeeVM= +cloud.google.com/go/storage v1.62.2 h1:WgR4U9n7bIzXkkVnwPKKE8bkaKUNsHG+0MAAlh9DGU4= +cloud.google.com/go/storage v1.62.2/go.mod h1:cpYz/kRVZ+UQAF1uHeea10/9ewcRbxGoGNKsS9daSXA= +cloud.google.com/go/trace v1.16.0 h1:GmQovzFc5F0CNfl0VLgL64aoTtu7xsM0YajW2GlG9+E= +cloud.google.com/go/trace v1.16.0/go.mod h1:r+bdAn16dKLSV1G2D5v3e58IlQlizfxWrUfjx7kM7X0= +filippo.io/edwards25519 v1.2.0 h1:crnVqOiS4jqYleHd9vaKZ+HKtHfllngJIiOpNpoJsjo= +filippo.io/edwards25519 v1.2.0/go.mod h1:xzAOLCNug/yB62zG1bQ8uziwrIqIuxhctzJT18Q77mc= +firebase.google.com/go/v4 v4.20.0 h1:ighpjeAC45rY/95cUQ+ojIKlKcTnz2YC0ldam56z2YU= +firebase.google.com/go/v4 v4.20.0/go.mod h1:hqhkQtZkThGH42TnaYi7A8EFR1E0FEuB5oHvJ1Q57t8= +fyne.io/fyne/v2 v2.7.4 h1:OVCI5mT+Onb2kA4wlmGA5pLCqKik9f4NDb5jiR1OMTc= +fyne.io/fyne/v2 v2.7.4/go.mod h1:ZD1mmhBY75mSa97IXl3MPlICd1uNHfCXYh5hKIlVOII= +fyne.io/systray v1.12.1 h1:ygBD6aZXwiOmZoY5N+ukbH9pih0Kq6fYgVeMYbr5skQ= +fyne.io/systray v1.12.1/go.mod h1:RVwqP9nYMo7h5zViCBHri2FgjXF7H2cub7MAq4NSoLs= +github.com/BurntSushi/toml v1.6.0 h1:dRaEfpa2VI55EwlIW72hMRHdWouJeRF7TPYhI+AUQjk= +github.com/BurntSushi/toml v1.6.0/go.mod h1:ukJfTF/6rtPPRCnwkur4qwRxa8vTRFBF0uk2lLoLwho= +github.com/DATA-DOG/go-sqlmock v1.5.2 h1:OcvFkGmslmlZibjAjaHm3L//6LiuBgolP7OputlJIzU= +github.com/DATA-DOG/go-sqlmock v1.5.2/go.mod h1:88MAG/4G7SMwSE3CeA0ZKzrT5CiOU3OJ+JlNzwDqpNU= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.32.0 h1:rIkQfkCOVKc1OiRCNcSDD8ml5RJlZbH/Xsq7lbpynwc= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.32.0/go.mod h1:RD2SsorTmYhF6HkTmDw7KmPYQk8OBYwTkuasChwv7R4= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.56.0 h1:O2sXMyJh8b7devAGdE+163xtRurt0RVpB6DIzX5vGfg= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.56.0/go.mod h1:hEpiGU18xf70qb3jbTcIggWAiEfX/cOIVc2OTe4OegA= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/cloudmock v0.56.0 h1:ZIT85vKP7LBS84XJ0WdJ3dPOX3iz4j3c0+lpajGQMyo= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/cloudmock v0.56.0/go.mod h1:rqP9UEhOXv9WhQ7Gjz+G5y/pf8+BJZW5/Ts0AhE0PwE= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.56.0 h1:0YP0+/ixwu+Uqeu/FGiBZNQ19huiUxxiPXIc9WsLKuQ= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.56.0/go.mod h1:6ZZMQhZKDvUvkJw2rc+oDP90tMMzuU/J+5HG1ZmPOmE= +github.com/MicahParks/keyfunc v1.9.0 h1:lhKd5xrFHLNOWrDc4Tyb/Q1AJ4LCzQ48GVJyVIID3+o= +github.com/MicahParks/keyfunc v1.9.0/go.mod h1:IdnCilugA0O/99dW+/MkvlyrsX8+L8+x95xuVNtM5jw= +github.com/agnivade/levenshtein v1.2.1 h1:EHBY3UOn1gwdy/VbFwgo4cxecRznFk7fKWN1KOX7eoM= +github.com/agnivade/levenshtein v1.2.1/go.mod h1:QVVI16kDrtSuwcpd0p1+xMC6Z/VfhtCyDIjcwga4/DU= +github.com/andreyvit/diff v0.0.0-20170406064948-c7f18ee00883 h1:bvNMNQO63//z+xNgfBlViaCIJKLlCJ6/fmUseuG0wVQ= +github.com/andreyvit/diff v0.0.0-20170406064948-c7f18ee00883/go.mod h1:rCTlJbsFo29Kk6CurOXKm700vrz8f0KW0JNfpkRJY/8= +github.com/andybalholm/brotli v1.2.1 h1:R+f5xP285VArJDRgowrfb9DqL18yVK0gKAW/F+eTWro= +github.com/andybalholm/brotli v1.2.1/go.mod h1:rzTDkvFWvIrjDXZHkuS16NPggd91W3kUSvPlQ1pLaKY= +github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5 h1:0CwZNZbxp69SHPdPJAN/hZIm0C4OItdklCFmMRWYpio= +github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs= +github.com/beeper/argo-go v1.1.2 h1:UQI2G8F+NLfGTOmTUI0254pGKx/HUU/etbUGTJv91Fs= +github.com/beeper/argo-go v1.1.2/go.mod h1:M+LJAnyowKVQ6Rdj6XYGEn+qcVFkb3R/MUpqkGR0hM4= +github.com/bsm/ginkgo/v2 v2.12.0 h1:Ny8MWAHyOepLGlLKYmXG4IEkioBysk6GpaRTLC8zwWs= +github.com/bsm/ginkgo/v2 v2.12.0/go.mod h1:SwYbGRRDovPVboqFv0tPTcG1sN61LM1Z4ARdbAV9g4c= +github.com/bsm/gomega v1.27.10 h1:yeMWxP2pV2fG3FgAODIY8EiRE3dy0aeFYt4l7wh6yKA= +github.com/bsm/gomega v1.27.10/go.mod h1:JyEr/xRbxbtgWNi8tIEVPUYZ5Dzef52k01W3YH0H+O0= +github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= +github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/clipperhouse/uax29/v2 v2.7.0 h1:+gs4oBZ2gPfVrKPthwbMzWZDaAFPGYK72F0NJv2v7Vk= +github.com/clipperhouse/uax29/v2 v2.7.0/go.mod h1:EFJ2TJMRUaplDxHKj1qAEhCtQPW2tJSwu5BF98AuoVM= +github.com/cncf/xds/go v0.0.0-20260202195803-dba9d589def2 h1:aBangftG7EVZoUb69Os8IaYg++6uMOdKK83QtkkvJik= +github.com/cncf/xds/go v0.0.0-20260202195803-dba9d589def2/go.mod h1:qwXFYgsP6T7XnJtbKlf1HP8AjxZZyzxMmc+Lq5GjlU4= +github.com/coder/websocket v1.8.14 h1:9L0p0iKiNOibykf283eHkKUHHrpG7f65OE3BhhO7v9g= +github.com/coder/websocket v1.8.14/go.mod h1:NX3SzP+inril6yawo5CQXx8+fk145lPDC6pumgx0mVg= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/dolthub/maphash v0.1.0 h1:bsQ7JsF4FkkWyrP3oCnFJgrCUAFbFf3kOl4L/QxPDyQ= +github.com/dolthub/maphash v0.1.0/go.mod h1:gkg4Ch4CdCDu5h6PMriVLawB7koZ+5ijb9puGMV50a4= +github.com/ebitengine/purego v0.10.1 h1:dewVBCBT2GaMu1SrNTYxQhgQBethzfhiwvZiLGP/qyY= +github.com/ebitengine/purego v0.10.1/go.mod h1:iIjxzd6CiRiOG0UyXP+V1+jWqUXVjPKLAI0mRfJZTmQ= +github.com/elliotchance/orderedmap/v3 v3.1.0 h1:j4DJ5ObEmMBt/lcwIecKcoRxIQUEnw0L804lXYDt/pg= +github.com/elliotchance/orderedmap/v3 v3.1.0/go.mod h1:G+Hc2RwaZvJMcS4JpGCOyViCnGeKf0bTYCGTO4uhjSo= +github.com/envoyproxy/go-control-plane v0.14.0 h1:hbG2kr4RuFj222B6+7T83thSPqLjwBIfQawTkC++2HA= +github.com/envoyproxy/go-control-plane v0.14.0/go.mod h1:NcS5X47pLl/hfqxU70yPwL9ZMkUlwlKxtAohpi2wBEU= +github.com/envoyproxy/go-control-plane/envoy v1.37.0 h1:u3riX6BoYRfF4Dr7dwSOroNfdSbEPe9Yyl09/B6wBrQ= +github.com/envoyproxy/go-control-plane/envoy v1.37.0/go.mod h1:DReE9MMrmecPy+YvQOAOHNYMALuowAnbjjEMkkWOi6A= +github.com/envoyproxy/go-control-plane/ratelimit v0.1.0 h1:/G9QYbddjL25KvtKTv3an9lx6VBE2cnb8wp1vEGNYGI= +github.com/envoyproxy/go-control-plane/ratelimit v0.1.0/go.mod h1:Wk+tMFAFbCXaJPzVVHnPgRKdUdwW/KdbRt94AzgRee4= +github.com/envoyproxy/protoc-gen-validate v1.3.3 h1:MVQghNeW+LZcmXe7SY1V36Z+WFMDjpqGAGacLe2T0ds= +github.com/envoyproxy/protoc-gen-validate v1.3.3/go.mod h1:TsndJ/ngyIdQRhMcVVGDDHINPLWB7C82oDArY51KfB0= +github.com/fasthttp/websocket v1.5.12 h1:e4RGPpWW2HTbL3zV0Y/t7g0ub294LkiuXXUuTOUInlE= +github.com/fasthttp/websocket v1.5.12/go.mod h1:I+liyL7/4moHojiOgUOIKEWm9EIxHqxZChS+aMFltyg= +github.com/felixge/fgprof v0.9.3 h1:VvyZxILNuCiUCSXtPtYmmtGvb65nqXh2QFWc0Wpf2/g= +github.com/felixge/fgprof v0.9.3/go.mod h1:RdbpDgzqYVh/T9fPELJyV7EYJuHB55UTEULNun8eiPw= +github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg= +github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= +github.com/fredbi/uri v1.1.1 h1:xZHJC08GZNIUhbP5ImTHnt5Ya0T8FI2VAwI/37kh2Ko= +github.com/fredbi/uri v1.1.1/go.mod h1:4+DZQ5zBjEwQCDmXW5JdIjz0PUA+yJbvtBv+u+adr5o= +github.com/fsnotify/fsnotify v1.10.1 h1:b0/UzAf9yR5rhf3RPm9gf3ehBPpf0oZKIjtpKrx59Ho= +github.com/fsnotify/fsnotify v1.10.1/go.mod h1:TLheqan6HD6GBK6PrDWyDPBaEV8LspOxvPSjC+bVfgo= +github.com/fxamacker/cbor/v2 v2.9.2 h1:X4Ksno9+x3cz0TZv69ec1hxP/+tymuR8PXQJyDwfh78= +github.com/fxamacker/cbor/v2 v2.9.2/go.mod h1:vM4b+DJCtHn+zz7h3FFp/hDAI9WNWCsZj23V5ytsSxQ= +github.com/fyne-io/gl-js v0.2.0 h1:+EXMLVEa18EfkXBVKhifYB6OGs3HwKO3lUElA0LlAjs= +github.com/fyne-io/gl-js v0.2.0/go.mod h1:ZcepK8vmOYLu96JoxbCKJy2ybr+g1pTnaBDdl7c3ajI= +github.com/fyne-io/glfw-js v0.3.0 h1:d8k2+Y7l+zy2pc7wlGRyPfTgZoqDf3AI4G+2zOWhWUk= +github.com/fyne-io/glfw-js v0.3.0/go.mod h1:Ri6te7rdZtBgBpxLW19uBpp3Dl6K9K/bRaYdJ22G8Jk= +github.com/fyne-io/image v0.1.1 h1:WH0z4H7qfvNUw5l4p3bC1q70sa5+YWVt6HCj7y4VNyA= +github.com/fyne-io/image v0.1.1/go.mod h1:xrfYBh6yspc+KjkgdZU/ifUC9sPA5Iv7WYUBzQKK7JM= +github.com/fyne-io/oksvg v0.2.0 h1:mxcGU2dx6nwjJsSA9PCYZDuoAcsZ/OuJlvg/Q9Njfo8= +github.com/fyne-io/oksvg v0.2.0/go.mod h1:dJ9oEkPiWhnTFNCmRgEze+YNprJF7YRbpjgpWS4kzoI= +github.com/gabriel-vasile/mimetype v1.4.13 h1:46nXokslUBsAJE/wMsp5gtO500a4F3Nkz9Ufpk2AcUM= +github.com/gabriel-vasile/mimetype v1.4.13/go.mod h1:d+9Oxyo1wTzWdyVUPMmXFvp4F9tea18J8ufA774AB3s= +github.com/gen2brain/go-fitz v1.24.15 h1:sJNB1MOWkqnzzENPHggFpgxTwW0+S5WF/rM5wUBpJWo= +github.com/gen2brain/go-fitz v1.24.15/go.mod h1:SftkiVbTHqF141DuiLwBBM65zP7ig6AVDQpf2WlHamo= +github.com/go-faker/faker/v4 v4.7.0 h1:VboC02cXHl/NuQh5lM2W8b87yp4iFXIu59x4w0RZi4E= +github.com/go-faker/faker/v4 v4.7.0/go.mod h1:u1dIRP5neLB6kTzgyVjdBOV5R1uP7BdxkcWk7tiKQXk= +github.com/go-gl/gl v0.0.0-20260331235117-4566fea9a276 h1:IO5P06Pcj9K04d+l4nrf3c2U56+dAotIFG6u4P1wAHI= +github.com/go-gl/gl v0.0.0-20260331235117-4566fea9a276/go.mod h1:9YTyiznxEY1fVinfM7RvRcjRHbw2xLBJ3AAGIT0I4Nw= +github.com/go-gl/glfw/v3.3/glfw v0.0.0-20260406072232-3ac4aa2bb164 h1:ddtotcEXIT7dFhSeXIWjK8YMFYl5bB2NdYQwgv6Uqjk= +github.com/go-gl/glfw/v3.3/glfw v0.0.0-20260406072232-3ac4aa2bb164/go.mod h1:SyRD8YfuKk+ZXlDqYiqe1qMSqjNgtHzBTG810KUagMc= +github.com/go-jose/go-jose/v4 v4.1.4 h1:moDMcTHmvE6Groj34emNPLs/qtYXRVcd6S7NHbHz3kA= +github.com/go-jose/go-jose/v4 v4.1.4/go.mod h1:x4oUasVrzR7071A4TnHLGSPpNOm2a21K9Kf04k1rs08= +github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/logr v1.4.3 h1:CjnDlHq8ikf6E492q6eKboGOC0T8CDaOvkHCIg8idEI= +github.com/go-logr/logr v1.4.3/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= +github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= +github.com/go-playground/assert/v2 v2.2.0 h1:JvknZsQTYeFEAhQwI4qEt9cyV5ONwRHC+lYKSsYSR8s= +github.com/go-playground/assert/v2 v2.2.0/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= +github.com/go-playground/locales v0.14.1 h1:EWaQ/wswjilfKLTECiXz7Rh+3BjFhfDFKv/oXslEjJA= +github.com/go-playground/locales v0.14.1/go.mod h1:hxrqLVvrK65+Rwrd5Fc6F2O76J/NuW9t0sjnWqG1slY= +github.com/go-playground/universal-translator v0.18.1 h1:Bcnm0ZwsGyWbCzImXv+pAJnYK9S473LQFuzCbDbfSFY= +github.com/go-playground/universal-translator v0.18.1/go.mod h1:xekY+UJKNuX9WP91TpwSH2VMlDf28Uj24BCp08ZFTUY= +github.com/go-playground/validator/v10 v10.30.2 h1:JiFIMtSSHb2/XBUbWM4i/MpeQm9ZK2xqPNk8vgvu5JQ= +github.com/go-playground/validator/v10 v10.30.2/go.mod h1:mAf2pIOVXjTEBrwUMGKkCWKKPs9NheYGabeB04txQSc= +github.com/go-sql-driver/mysql v1.10.0 h1:Q+1LV8DkHJvSYAdR83XzuhDaTykuDx0l6fkXxoWCWfw= +github.com/go-sql-driver/mysql v1.10.0/go.mod h1:M+cqaI7+xxXGG9swrdeUIoPG3Y3KCkF0pZej+SK+nWk= +github.com/go-telegram-bot-api/telegram-bot-api/v5 v5.5.1 h1:wG8n/XJQ07TmjbITcGiUaOtXxdrINDz1b0J1w0SzqDc= +github.com/go-telegram-bot-api/telegram-bot-api/v5 v5.5.1/go.mod h1:A2S0CWkNylc2phvKXWBBdD3K0iGnDBGbzRpISP2zBl8= +github.com/go-text/render v0.2.1 h1:qwHhxqGUjjg4L0XyJWj7M7bpY75NZM+kBpv2Yfw5mcg= +github.com/go-text/render v0.2.1/go.mod h1:HCCAq8MUlm/WRcXshBb4K/n+IkjeXQ1c2Ba+yICSm0A= +github.com/go-text/typesetting v0.3.4 h1:YYurUOtEb9kGSOz4uE3k4OpBGsp1dDL8+fjCeaFamAU= +github.com/go-text/typesetting v0.3.4/go.mod h1:4qZCQphq4KSgGTAeI0uMEkVbROgfah8BuyF5LRYr7XY= +github.com/go-text/typesetting-utils v0.0.0-20260223113751-2d88ac90dae3 h1:drBZzMgdYPbmyXqOto4YhhJGrFIQCX94FpR4MzTCsos= +github.com/go-text/typesetting-utils v0.0.0-20260223113751-2d88ac90dae3/go.mod h1:3/62I4La/HBRX9TcTpBj4eipLiwzf+vhI+7whTc9V7o= +github.com/godbus/dbus/v5 v5.2.2 h1:TUR3TgtSVDmjiXOgAAyaZbYmIeP3DPkld3jgKGV8mXQ= +github.com/godbus/dbus/v5 v5.2.2/go.mod h1:3AAv2+hPq5rdnr5txxxRwiGjPXamgoIHgz9FPBfOp3c= +github.com/gofiber/contrib/v3/websocket v1.1.5 h1:f6hVxWO9dqDx0xGSaz4XDSr/QauhAcDtREajLhShRnM= +github.com/gofiber/contrib/v3/websocket v1.1.5/go.mod h1:7tXTp2n9qa6epS2qWVP/S5Eky8M9S8MGmuhBNhANT/A= +github.com/gofiber/fiber/v2 v2.52.13 h1:TOKP64iqC9b5P49VrBW5tHhUOvDyrtJ0xePEfzJbCbk= +github.com/gofiber/fiber/v2 v2.52.13/go.mod h1:YEcBbO/FB+5M1IZNBP9FO3J9281zgPAreiI1oqg8nDw= +github.com/gofiber/fiber/v3 v3.3.0 h1:QBd3sYCqdy6Qs5gJYzSw4I4SbqL204jPqpdub/ueiw8= +github.com/gofiber/fiber/v3 v3.3.0/go.mod h1:YH7/TAoRaU4kF8slDCtQuFJ1NzC+3MtxUI4KfvQtaIA= +github.com/gofiber/schema v1.7.1 h1:oSJBKdgP8JeIME4TQSAqlNKTU2iBB+2RNmKi8Nsc+TI= +github.com/gofiber/schema v1.7.1/go.mod h1:A/X5Ffyru4p9eBdp99qu+nzviHzQiZ7odLT+TwxWhbk= +github.com/gofiber/utils/v2 v2.0.6 h1:7fXYy7nSsyqbH0GQUMtK4Kwjy4J7R5742VM7JsZxzOs= +github.com/gofiber/utils/v2 v2.0.6/go.mod h1:p7mAHAk3+oUK10ZX2xTw9fZQixb4hCg8SKd4IH2xroU= +github.com/gofrs/uuid v4.4.0+incompatible h1:3qXRTX8/NbyulANqlc0lchS1gqAVxRgsuW1YrTJupqA= +github.com/gofrs/uuid v4.4.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= +github.com/golang-jwt/jwt/v4 v4.4.2/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= +github.com/golang-jwt/jwt/v4 v4.5.2 h1:YtQM7lnr8iZ+j5q71MGKkNw9Mn7AjHM68uc9g5fXeUI= +github.com/golang-jwt/jwt/v4 v4.5.2/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= +github.com/golang-jwt/jwt/v5 v5.3.1 h1:kYf81DTWFe7t+1VvL7eS+jKFVWaUnK9cB1qbwn63YCY= +github.com/golang-jwt/jwt/v5 v5.3.1/go.mod h1:fxCRLWMO43lRc8nhHWY6LGqRcf+1gQWArsqaEUEa5bE= +github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= +github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= +github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= +github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= +github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU= +github.com/google/martian/v3 v3.3.3 h1:DIhPTQrbPkgs2yJYdXU/eNACCG5DVQjySNRNlflZ9Fc= +github.com/google/martian/v3 v3.3.3/go.mod h1:iEPrYcgCF7jA9OtScMFQyAlZZ4YXTKEtJ1E6RWzmBA0= +github.com/google/pprof v0.0.0-20211214055906-6f57359322fd h1:1FjCyPC+syAzJ5/2S8fqdZK1R22vvA0J7JZKcuOIQ7Y= +github.com/google/pprof v0.0.0-20211214055906-6f57359322fd/go.mod h1:KgnwoLYCZ8IQu3XUZ8Nc/bM9CCZFOyjUNOSygVozoDg= +github.com/google/s2a-go v0.1.9 h1:LGD7gtMgezd8a/Xak7mEWL0PjoTQFvpRudN895yqKW0= +github.com/google/s2a-go v0.1.9/go.mod h1:YA0Ei2ZQL3acow2O62kdp9UlnvMmU7kA6Eutn0dXayM= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/googleapis/enterprise-certificate-proxy v0.3.16 h1:F/VPrx0YPBdksZJQdCAp0WUsqnNmZpUZszzfYt0M5Dw= +github.com/googleapis/enterprise-certificate-proxy v0.3.16/go.mod h1:9Yb0eAkH/Xqhvv3zbeKf/+wMJqCeocWc6KIhDvEAuYE= +github.com/googleapis/gax-go/v2 v2.22.0 h1:PjIWBpgGIVKGoCXuiCoP64altEJCj3/Ei+kSU5vlZD4= +github.com/googleapis/gax-go/v2 v2.22.0/go.mod h1:irWBbALSr0Sk3qlqb9SyJ1h68WjgeFuiOzI4Rqw5+aY= +github.com/gorilla/websocket v1.5.3 h1:saDtZ6Pbx/0u+bgYQ3q96pZgCzfhKXGPqt7kZ72aNNg= +github.com/gorilla/websocket v1.5.3/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= +github.com/hack-pad/go-indexeddb v0.3.2 h1:DTqeJJYc1usa45Q5r52t01KhvlSN02+Oq+tQbSBI91A= +github.com/hack-pad/go-indexeddb v0.3.2/go.mod h1:QvfTevpDVlkfomY498LhstjwbPW6QC4VC/lxYb0Kom0= +github.com/hack-pad/safejs v0.1.1 h1:d5qPO0iQ7h2oVtpzGnLExE+Wn9AtytxIfltcS2b9KD8= +github.com/hack-pad/safejs v0.1.1/go.mod h1:HdS+bKF1NrE72VoXZeWzxFOVQVUSqZJAG0xNCnb+Tio= +github.com/jeandeaual/go-locale v0.0.0-20250612000132-0ef82f21eade h1:FmusiCI1wHw+XQbvL9M+1r/C3SPqKrmBaIOYwVfQoDE= +github.com/jeandeaual/go-locale v0.0.0-20250612000132-0ef82f21eade/go.mod h1:ZDXo8KHryOWSIqnsb/CiDq7hQUYryCgdVnxbj8tDG7o= +github.com/joho/godotenv v1.5.1 h1:7eLL/+HRGLY0ldzfGMeQkb7vMd0as4CfYvUVzLqw0N0= +github.com/joho/godotenv v1.5.1/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4= +github.com/jpillora/backoff v1.0.0 h1:uvFg412JmmHBHw7iwprIxkPMI+sGQ4kzOWsMeHnm2EA= +github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= +github.com/jpillora/chisel v1.11.6 h1:wqlbuatAk8pst2GNY7d2F4AnHxMaLVOA2S/SkC7OlEg= +github.com/jpillora/chisel v1.11.6/go.mod h1:gAFVTwDLIMM/dH0w1twfSXz0NQUnBVWrlimi707vk7k= +github.com/jpillora/sizestr v1.0.0 h1:4tr0FLxs1Mtq3TnsLDV+GYUWG7Q26a6s+tV5Zfw2ygw= +github.com/jpillora/sizestr v1.0.0/go.mod h1:bUhLv4ctkknatr6gR42qPxirmd5+ds1u7mzD+MZ33f0= +github.com/jsummers/gobmp v0.0.0-20230614200233-a9de23ed2e25 h1:YLvr1eE6cdCqjOe972w/cYF+FjW34v27+9Vo5106B4M= +github.com/jsummers/gobmp v0.0.0-20230614200233-a9de23ed2e25/go.mod h1:kLgvv7o6UM+0QSf0QjAse3wReFDsb9qbZJdfexWlrQw= +github.com/jupiterrider/ffi v0.7.0 h1:RKsl6Ascal+3kyAqR5Qcbp83LceQMLc1VZbPfHWoNzs= +github.com/jupiterrider/ffi v0.7.0/go.mod h1:9dauhpOfNqrqk28fxuu0kkdeFtT9Qr4vbfigiuIXN7c= +github.com/klauspost/compress v1.18.6 h1:2jupLlAwFm95+YDR+NwD2MEfFO9d4z4Prjl1XXDjuao= +github.com/klauspost/compress v1.18.6/go.mod h1:cwPg85FWrGar70rWktvGQj8/hthj3wpl0PGDogxkrSQ= +github.com/klauspost/cpuid/v2 v2.2.10 h1:tBs3QSyvjDyFTq3uoc/9xFpCuOsJQFNPiAhYdw2skhE= +github.com/klauspost/cpuid/v2 v2.2.10/go.mod h1:hqwkgyIinND0mEev00jJYCxPNVRVXFQeu1XKlok6oO0= +github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= +github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= +github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/leodido/go-urn v1.4.0 h1:WT9HwE9SGECu3lg4d/dIA+jxlljEa1/ffXKmRjqdmIQ= +github.com/leodido/go-urn v1.4.0/go.mod h1:bvxc+MVxLKB4z00jd1z+Dvzr47oO32F/QSNjSBOlFxI= +github.com/lxzan/gws v1.8.9 h1:VU3SGUeWlQrEwfUSfokcZep8mdg/BrUF+y73YYshdBM= +github.com/lxzan/gws v1.8.9/go.mod h1:d9yHaR1eDTBHagQC6KY7ycUOaz5KWeqQtP3xu7aMK8Y= +github.com/mattn/go-colorable v0.1.14 h1:9A9LHSqF/7dyVVX6g0U9cwm9pG3kP9gSzcuIPHPsaIE= +github.com/mattn/go-colorable v0.1.14/go.mod h1:6LmQG8QLFO4G5z1gPvYEzlUgJ2wF+stgPZH1UqBm1s8= +github.com/mattn/go-isatty v0.0.22 h1:j8l17JJ9i6VGPUFUYoTUKPSgKe/83EYU2zBC7YNKMw4= +github.com/mattn/go-isatty v0.0.22/go.mod h1:ZXfXG4SQHsB/w3ZeOYbR0PrPwLy+n6xiMrJlRFqopa4= +github.com/mattn/go-runewidth v0.0.23 h1:7ykA0T0jkPpzSvMS5i9uoNn2Xy3R383f9HDx3RybWcw= +github.com/mattn/go-runewidth v0.0.23/go.mod h1:XBkDxAl56ILZc9knddidhrOlY5R/pDhgLpndooCuJAs= +github.com/mattn/go-sqlite3 v1.14.44 h1:3VSe+xafpbzsLbdr2AWlAZk9yRHiBhTBakioXaCKTF8= +github.com/mattn/go-sqlite3 v1.14.44/go.mod h1:pjEuOr8IwzLJP2MfGeTb0A35jauH+C2kbHKBr7yXKVQ= +github.com/mdp/qrterminal/v3 v3.2.1 h1:6+yQjiiOsSuXT5n9/m60E54vdgFsw0zhADHhHLrFet4= +github.com/mdp/qrterminal/v3 v3.2.1/go.mod h1:jOTmXvnBsMy5xqLniO0R++Jmjs2sTm9dFSuQ5kpz/SU= +github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= +github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= +github.com/nfnt/resize v0.0.0-20180221191011-83c6a9932646 h1:zYyBkD/k9seD2A7fsi6Oo2LfFZAehjjQMERAvZLEDnQ= +github.com/nfnt/resize v0.0.0-20180221191011-83c6a9932646/go.mod h1:jpp1/29i3P1S/RLdc7JQKbRpFeM1dOBd8T9ki5s+AY8= +github.com/nicksnyder/go-i18n/v2 v2.6.1 h1:JDEJraFsQE17Dut9HFDHzCoAWGEQJom5s0TRd17NIEQ= +github.com/nicksnyder/go-i18n/v2 v2.6.1/go.mod h1:Vee0/9RD3Quc/NmwEjzzD7VTZ+Ir7QbXocrkhOzmUKA= +github.com/petermattis/goid v0.0.0-20260330135022-df67b199bc81 h1:WDsQxOJDy0N1VRAjXLpi8sCEZRSGarLWQevDxpTBRrM= +github.com/petermattis/goid v0.0.0-20260330135022-df67b199bc81/go.mod h1:pxMtw7cyUw6B2bRH0ZBANSPg+AoSud1I1iyJHI69jH4= +github.com/philhofer/fwd v1.2.0 h1:e6DnBTl7vGY+Gz322/ASL4Gyp1FspeMvx1RNDoToZuM= +github.com/philhofer/fwd v1.2.0/go.mod h1:RqIHx9QI14HlwKwm98g9Re5prTQ6LdeRQn+gXJFxsJM= +github.com/pkg/profile v1.7.0 h1:hnbDkaNWPCLMO9wGLdBFTIZvzDrDfBM2072E1S9gJkA= +github.com/pkg/profile v1.7.0/go.mod h1:8Uer0jas47ZQMJ7VD+OHknK4YDY07LPUC6dEvqDjvNo= +github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 h1:GFCKgmp0tecUJ0sJuv4pzYCqS9+RGSn52M3FUwPs+uo= +github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10/go.mod h1:t/avpk3KcrXxUnYOhZhMXJlSEyie6gQbtLq5NM3loB8= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/prplecake/go-thumbnail v0.1.6 h1:6mBLXL2/79QHYRCvrciiLtT6vAJfOaMAvNhmjsyLX1c= +github.com/prplecake/go-thumbnail v0.1.6/go.mod h1:v8PaF1YrWlJjdkROeoDgDil5nFycVdH7taPOl/NS830= +github.com/redis/go-redis/v9 v9.19.0 h1:XPVaaPSnG6RhYf7p+rmSa9zZfeVAnWsH5h3lxthOm/k= +github.com/redis/go-redis/v9 v9.19.0/go.mod h1:v/M13XI1PVCDcm01VtPFOADfZtHf8YW3baQf57KlIkA= +github.com/robfig/cron/v3 v3.0.1 h1:WdRxkvbJztn8LMz/QEvLN5sBU+xKpSqwwUO1Pjr4qDs= +github.com/robfig/cron/v3 v3.0.1/go.mod h1:eQICP3HwyT7UooqI/z+Ov+PtYAWygg1TEWWzGIFLtro= +github.com/rogpeppe/go-internal v1.14.1 h1:UQB4HGPB6osV0SQTLymcB4TgvyWu6ZyliaW0tI/otEQ= +github.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7so1lCWt35ZSgc= +github.com/rpsoftech/mysqldump v0.0.0-20250611190005-213bcf343081 h1:BhhQEZcCQNHuJ80dzWHzmroYro0rvijuPaIM12atvNg= +github.com/rpsoftech/mysqldump v0.0.0-20250611190005-213bcf343081/go.mod h1:r/BoxnMDP7PN0Hbyysah74N/VHbv6KrnIZ6f7fRsljk= +github.com/rs/zerolog v1.35.1 h1:m7xQeoiLIiV0BCEY4Hs+j2NG4Gp2o2KPKmhnnLiazKI= +github.com/rs/zerolog v1.35.1/go.mod h1:EjML9kdfa/RMA7h/6z6pYmq1ykOuA8/mjWaEvGI+jcw= +github.com/rymdport/portal v0.4.2 h1:7jKRSemwlTyVHHrTGgQg7gmNPJs88xkbKcIL3NlcmSU= +github.com/rymdport/portal v0.4.2/go.mod h1:kFF4jslnJ8pD5uCi17brj/ODlfIidOxlgUDTO5ncnC4= +github.com/savsgio/gotils v0.0.0-20250924091648-bce9a52d7761 h1:McifyVxygw1d67y6vxUqls2D46J8W9nrki9c8c0eVvE= +github.com/savsgio/gotils v0.0.0-20250924091648-bce9a52d7761/go.mod h1:Vi9gvHvTw4yCUHIznFl5TPULS7aXwgaTByGeBY75Wko= +github.com/sergi/go-diff v1.3.1 h1:xkr+Oxo4BOQKmkn/B9eMK0g5Kg/983T9DqqPHwYqD+8= +github.com/sergi/go-diff v1.3.1/go.mod h1:aMJSSKb2lpPvRNec0+w3fl7LP9IOFzdc9Pa4NFbPK1I= +github.com/shamaton/msgpack/v3 v3.1.2 h1:d5gWAIyMU4M0WgDjz6IFSCuXJUA2dFwRHBpDclE8CLw= +github.com/shamaton/msgpack/v3 v3.1.2/go.mod h1:DcQG8jrdrQCIxr3HlMYkiXdMhK+KfN2CitkyzsQV4uc= +github.com/skip2/go-qrcode v0.0.0-20200617195104-da1b6568686e h1:MRM5ITcdelLK2j1vwZ3Je0FKVCfqOLp5zO6trqMLYs0= +github.com/skip2/go-qrcode v0.0.0-20200617195104-da1b6568686e/go.mod h1:XV66xRDqSt+GTGFMVlhk3ULuV0y9ZmzeVGR4mloJI3M= +github.com/spiffe/go-spiffe/v2 v2.6.0 h1:l+DolpxNWYgruGQVV0xsfeya3CsC7m8iBzDnMpsbLuo= +github.com/spiffe/go-spiffe/v2 v2.6.0/go.mod h1:gm2SeUoMZEtpnzPNs2Csc0D/gX33k1xIx7lEzqblHEs= +github.com/srwiley/oksvg v0.0.0-20221011165216-be6e8873101c h1:km8GpoQut05eY3GiYWEedbTT0qnSxrCjsVbb7yKY1KE= +github.com/srwiley/oksvg v0.0.0-20221011165216-be6e8873101c/go.mod h1:cNQ3dwVJtS5Hmnjxy6AgTPd0Inb3pW05ftPSX7NZO7Q= +github.com/srwiley/rasterx v0.0.0-20220730225603-2ab79fcdd4ef h1:Ch6Q+AZUxDBCVqdkI8FSpFyZDtCVBc2VmejdNrm5rRQ= +github.com/srwiley/rasterx v0.0.0-20220730225603-2ab79fcdd4ef/go.mod h1:nXTWP6+gD5+LUJ8krVhhoeHjvHTutPxMYl5SvkcnJNE= +github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U= +github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U= +github.com/surrealdb/surrealdb.go v1.4.0 h1:c3Tump5z+b1j27M6Puj0By59axd13ME2NFYptHiIdRw= +github.com/surrealdb/surrealdb.go v1.4.0/go.mod h1:ju3vn9OHXde9Ulvc7/fP9I8ylkiapOdBSdrEs2PmTtA= +github.com/tinylib/msgp v1.6.4 h1:mOwYbyYDLPj35mkA2BjjYejgJk9BuHxDdvRnb6v2ZcQ= +github.com/tinylib/msgp v1.6.4/go.mod h1:RSp0LW9oSxFut3KzESt5Voq4GVWyS+PSulT77roAqEA= +github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw= +github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= +github.com/valyala/fasthttp v1.71.0 h1:tepR7H+Guh9VUqxxcPggYi8R3lGUu2Rsdh+z7/FCY3k= +github.com/valyala/fasthttp v1.71.0/go.mod h1:z1sDUvOShhXq/C9mwH/fSm1Vb71tUJwmQdgkBrBNwnA= +github.com/vektah/gqlparser/v2 v2.5.33 h1:lRp8aIeNUNbimf/axZd7ETg24q06hBtPaas+TcvI/7E= +github.com/vektah/gqlparser/v2 v2.5.33/go.mod h1:c1I28gSOVNzlfc4WuDlqU7voQnsqI6OG2amkBAFmgts= +github.com/x448/float16 v0.8.4 h1:qLwI1I70+NjRFUR3zs1JPUCgaCXSh3SW62uAKT1mSBM= +github.com/x448/float16 v0.8.4/go.mod h1:14CWIYCyZA/cWjXOioeEpHeN/83MdbZDRQHoFcYsOfg= +github.com/xdg-go/pbkdf2 v1.0.0 h1:Su7DPu48wXMwC3bs7MCNG+z4FhcyEuz5dlvchbq0B0c= +github.com/xdg-go/pbkdf2 v1.0.0/go.mod h1:jrpuAogTd400dnrH08LKmI/xc1MbPOebTwRqcT5RDeI= +github.com/xdg-go/scram v1.2.0 h1:bYKF2AEwG5rqd1BumT4gAnvwU/M9nBp2pTSxeZw7Wvs= +github.com/xdg-go/scram v1.2.0/go.mod h1:3dlrS0iBaWKYVt2ZfA4cj48umJZ+cAEbR6/SjLA88I8= +github.com/xdg-go/stringprep v1.0.4 h1:XLI/Ng3O1Atzq0oBs3TWm+5ZVgkq2aqdlvP9JtoZ6c8= +github.com/xdg-go/stringprep v1.0.4/go.mod h1:mPGuuIYwz7CmR2bT9j4GbQqutWS1zV24gijq1dTyGkM= +github.com/xyproto/randomstring v1.0.5 h1:YtlWPoRdgMu3NZtP45drfy1GKoojuR7hmRcnhZqKjWU= +github.com/xyproto/randomstring v1.0.5/go.mod h1:rgmS5DeNXLivK7YprL0pY+lTuhNQW3iGxZ18UQApw/E= +github.com/youmark/pkcs8 v0.0.0-20240726163527-a2c0da244d78 h1:ilQV1hzziu+LLM3zUTJ0trRztfwgjqKnBWNtSRkbmwM= +github.com/youmark/pkcs8 v0.0.0-20240726163527-a2c0da244d78/go.mod h1:aL8wCCfTfSfmXjznFBSZNN13rSJjlIOI1fUNAtF7rmI= +github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= +github.com/yuin/goldmark v1.8.2 h1:kEGpgqJXdgbkhcOgBxkC0X0PmoPG1ZyoZ117rDVp4zE= +github.com/yuin/goldmark v1.8.2/go.mod h1:ip/1k0VRfGynBgxOz0yCqHrbZXhcjxyuS66Brc7iBKg= +github.com/zeebo/xxh3 v1.1.0 h1:s7DLGDK45Dyfg7++yxI0khrfwq9661w9EN78eP/UZVs= +github.com/zeebo/xxh3 v1.1.0/go.mod h1:IisAie1LELR4xhVinxWS5+zf1lA4p0MW4T+w+W07F5s= +go.mau.fi/libsignal v0.2.1 h1:vRZG4EzTn70XY6Oh/pVKrQGuMHBkAWlGRC22/85m9L0= +go.mau.fi/libsignal v0.2.1/go.mod h1:iVvjrHyfQqWajOUaMEsIfo3IqgVMrhWcPiiEzk7NgoU= +go.mau.fi/util v0.9.9 h1:ujDeXCo07HBor5oQLyO1tHklupmqVmPgasc53d7q/NE= +go.mau.fi/util v0.9.9/go.mod h1:pqt4Vcrt+5gcH/CgrHZg11qSx+b34o6mknGzOEA6waY= +go.mau.fi/whatsmeow v0.0.0-20260525123251-933deb5f2ee9 h1:l1E9YRXQhjS7Sm6XbYPq8oiSedSCOB6h3FMqZ8pt+K4= +go.mau.fi/whatsmeow v0.0.0-20260525123251-933deb5f2ee9/go.mod h1:SY+3c678dbtckGZF16M+sfEW8ZxTb9xkaKwhXueF5yE= +go.mongodb.org/mongo-driver/v2 v2.6.0 h1:b9sJOYrkmt4l8bY43ZenFBcPlhYIjaOfYHLtbB/5qi8= +go.mongodb.org/mongo-driver/v2 v2.6.0/go.mod h1:yOI9kBsufol30iFsl1slpdq1I0eHPzybRWdyYUs8K/0= +go.opentelemetry.io/auto/sdk v1.2.1 h1:jXsnJ4Lmnqd11kwkBV2LgLoFMZKizbCi5fNZ/ipaZ64= +go.opentelemetry.io/auto/sdk v1.2.1/go.mod h1:KRTj+aOaElaLi+wW1kO/DZRXwkF4C5xPbEe3ZiIhN7Y= +go.opentelemetry.io/contrib/detectors/gcp v1.43.0 h1:62yY3dT7/ShwOxzA0RsKRgshBmfElKI4d/Myu2OxDFU= +go.opentelemetry.io/contrib/detectors/gcp v1.43.0/go.mod h1:RyaZMFY7yi1kAs45S6mbFGz8O8rqB0dTY14uzvG4LCs= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.68.0 h1:0Qx7VGBacMm9ZENQ7TnNObTYI4ShC+lHI16seduaxZo= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.68.0/go.mod h1:Sje3i3MjSPKTSPvVWCaL8ugBzJwik3u4smCjUeuupqg= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.68.0 h1:CqXxU8VOmDefoh0+ztfGaymYbhdB/tT3zs79QaZTNGY= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.68.0/go.mod h1:BuhAPThV8PBHBvg8ZzZ/Ok3idOdhWIodywz2xEcRbJo= +go.opentelemetry.io/otel v1.43.0 h1:mYIM03dnh5zfN7HautFE4ieIig9amkNANT+xcVxAj9I= +go.opentelemetry.io/otel v1.43.0/go.mod h1:JuG+u74mvjvcm8vj8pI5XiHy1zDeoCS2LB1spIq7Ay0= +go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.43.0 h1:TC+BewnDpeiAmcscXbGMfxkO+mwYUwE/VySwvw88PfA= +go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.43.0/go.mod h1:J/ZyF4vfPwsSr9xJSPyQ4LqtcTPULFR64KwTikGLe+A= +go.opentelemetry.io/otel/metric v1.43.0 h1:d7638QeInOnuwOONPp4JAOGfbCEpYb+K6DVWvdxGzgM= +go.opentelemetry.io/otel/metric v1.43.0/go.mod h1:RDnPtIxvqlgO8GRW18W6Z/4P462ldprJtfxHxyKd2PY= +go.opentelemetry.io/otel/sdk v1.43.0 h1:pi5mE86i5rTeLXqoF/hhiBtUNcrAGHLKQdhg4h4V9Dg= +go.opentelemetry.io/otel/sdk v1.43.0/go.mod h1:P+IkVU3iWukmiit/Yf9AWvpyRDlUeBaRg6Y+C58QHzg= +go.opentelemetry.io/otel/sdk/metric v1.43.0 h1:S88dyqXjJkuBNLeMcVPRFXpRw2fuwdvfCGLEo89fDkw= +go.opentelemetry.io/otel/sdk/metric v1.43.0/go.mod h1:C/RJtwSEJ5hzTiUz5pXF1kILHStzb9zFlIEe85bhj6A= +go.opentelemetry.io/otel/trace v1.43.0 h1:BkNrHpup+4k4w+ZZ86CZoHHEkohws8AY+WTX09nk+3A= +go.opentelemetry.io/otel/trace v1.43.0/go.mod h1:/QJhyVBUUswCphDVxq+8mld+AvhXZLhe+8WVFxiFff0= +go.uber.org/atomic v1.11.0 h1:ZvwS0R+56ePWxUNi+Atn9dWONBPp/AUETXlHW0DxSjE= +go.uber.org/atomic v1.11.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0= +go.yaml.in/yaml/v3 v3.0.4 h1:tfq32ie2Jv2UxXFdLJdh3jXuOzWiL1fo0bu/FbuKpbc= +go.yaml.in/yaml/v3 v3.0.4/go.mod h1:DhzuOOF2ATzADvBadXxruRBLzYTpT36CKvDb3+aBEFg= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.52.0 h1:RMs7fP2rXdep0CftQlK8Uf+kibLm7qkCcradZWYz988= +golang.org/x/crypto v0.52.0/go.mod h1:1QgfPxDqh0T2M/elOJtp9RvuR95kVjir0e6/BvEmGbc= +golang.org/x/exp v0.0.0-20260508232706-74f9aab9d74a h1:+3jdDGGB8NGb1Zktc737jlt3/A5f6UlwSzmvqUuufxw= +golang.org/x/exp v0.0.0-20260508232706-74f9aab9d74a/go.mod h1:d2fgXJLVs4dYDHUk5lwMIfzRzSrWCfGZb0ZqeLa/Vcw= +golang.org/x/image v0.0.0-20220302094943-723b81ca9867/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM= +golang.org/x/image v0.41.0 h1:8wS72eGJMJaBxK6okTzd4WaXumUlTVlb753MlsSvTCo= +golang.org/x/image v0.41.0/go.mod h1:uIc348UZMSvS5Z65CVZ7iDPaNobNFEPeJ4kbqTOszmA= +golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.55.0 h1:bcvxaJn3e1U6InsFWt1JUq1aSjnRxLzT2rtD2KfkDF8= +golang.org/x/net v0.55.0/go.mod h1:L5U2KuzuOe1lY7Z+aWVIKK6qEeJXnXV9yzGA+WCHJww= +golang.org/x/oauth2 v0.36.0 h1:peZ/1z27fi9hUOFCAZaHyrpWG5lwe0RJEEEeH0ThlIs= +golang.org/x/oauth2 v0.36.0/go.mod h1:YDBUJMTkDnJS+A4BP4eZBjCqtokkg1hODuPjwiGPO7Q= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.20.0 h1:e0PTpb7pjO8GAtTs2dQ6jYa5BWYlMuX047Dco/pItO4= +golang.org/x/sync v0.20.0/go.mod h1:9xrNwdLfx4jkKbNva9FpL6vEN7evnE43NNNJQ2LF3+0= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.45.0 h1:dO4czNzziLiiXplLQgBCEpCvXQ3dnkn0SdaZSYdQ+FY= +golang.org/x/sys v0.45.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw= +golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= +golang.org/x/term v0.43.0 h1:S4RLU2sB31O/NCl+zFN9Aru9A/Cq2aqKpTZJ6B+DwT4= +golang.org/x/term v0.43.0/go.mod h1:lrhlHNdQJHO+1qVYiHfFKVuVioJIheAc3fBSMFYEIsk= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= +golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ= +golang.org/x/text v0.37.0 h1:Cqjiwd9eSg8e0QAkyCaQTNHFIIzWtidPahFWR83rTrc= +golang.org/x/text v0.37.0/go.mod h1:a5sjxXGs9hsn/AJVwuElvCAo9v8QYLzvavO5z2PiM38= +golang.org/x/time v0.15.0 h1:bbrp8t3bGUeFOx08pvsMYRTCVSMk89u4tKbNOZbp88U= +golang.org/x/time v0.15.0/go.mod h1:Y4YMaQmXwGQZoFaVFk4YpCt4FLQMYKZe9oeV/f4MSno= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= +golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +gonum.org/v1/gonum v0.17.0 h1:VbpOemQlsSMrYmn7T2OUvQ4dqxQXU+ouZFQsZOx50z4= +gonum.org/v1/gonum v0.17.0/go.mod h1:El3tOrEuMpv2UdMrbNlKEh9vd86bmQ6vqIcDwxEOc1E= +google.golang.org/api v0.280.0 h1:F4OfEHZhZh6a7uTufJAXXVd/2TQ8EjM4vZH+jX/vFYk= +google.golang.org/api v0.280.0/go.mod h1:oGKmPZRDoD3vdkf6MA7F4VNkR1rxCiuaPSkhsf3EolU= +google.golang.org/appengine/v2 v2.0.6 h1:LvPZLGuchSBslPBp+LAhihBeGSiRh1myRoYK4NtuBIw= +google.golang.org/appengine/v2 v2.0.6/go.mod h1:WoEXGoXNfa0mLvaH5sV3ZSGXwVmy8yf7Z1JKf3J3wLI= +google.golang.org/genproto v0.0.0-20260523011958-0a33c5d7ca68 h1:cTHF8xtqtBN5sQ4dcoNwOS6FFejvFTkWQbZXsTU3trM= +google.golang.org/genproto v0.0.0-20260523011958-0a33c5d7ca68/go.mod h1:RRHjglSYABVCWpQ7USCpdfhcd9t4PkajvVwyynZizTc= +google.golang.org/genproto/googleapis/api v0.0.0-20260523011958-0a33c5d7ca68 h1:WVVw1Nl19li0fMX++FJ3ye1z9+S1N35QODDy5qpnaXw= +google.golang.org/genproto/googleapis/api v0.0.0-20260523011958-0a33c5d7ca68/go.mod h1:1dCETSCY2YKZNXQE3h4fun3TYwF5p8jejRKZgfWAgAY= +google.golang.org/genproto/googleapis/rpc v0.0.0-20260523011958-0a33c5d7ca68 h1:PvEgGJf9C/1u5CHkInMg7UFYYUoiaQmW2LbtH0pjB78= +google.golang.org/genproto/googleapis/rpc v0.0.0-20260523011958-0a33c5d7ca68/go.mod h1:4Hqkh8ycfw05ld/3BWL7rJOSfebL2Q+DVDeRgYgxUU8= +google.golang.org/grpc v1.81.1 h1:VnnIIZ88UzOOKLukQi+ImGz8O1Wdp8nAGGnvOfEIWQQ= +google.golang.org/grpc v1.81.1/go.mod h1:xGH9GfzOyMTGIOXBJmXt+BX/V0kcdQbdcuwQ/zNw42I= +google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= +google.golang.org/protobuf v1.30.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +google.golang.org/protobuf v1.36.11 h1:fV6ZwhNocDyBLK0dj+fg8ektcVegBBuEolpbTQyBNVE= +google.golang.org/protobuf v1.36.11/go.mod h1:HTf+CrKn2C3g5S8VImy6tdcUvCska2kB7j23XfzDpco= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +rsc.io/qr v0.2.0 h1:6vBLea5/NRMVTz8V66gipeLycZMl/+UlFmk8DvqQ6WY= +rsc.io/qr v0.2.0/go.mod h1:IF+uZjkb9fqyeF/4tlBoynqmQxUoPfWEKh921coOuXs= diff --git a/linux.sh b/linux.sh index 90258f6..2bfda69 100755 --- a/linux.sh +++ b/linux.sh @@ -14,3 +14,4 @@ GOOS=linux GOARCH=amd64 go build -o "dist/linux-amd64/mysql-to-mysql.o" -ldflags GOOS=linux GOARCH=amd64 go build -o "dist/linux-amd64/mysql-backup-cmd.o" -v -ldflags="-s -w" ./servers/jwelly/mysql-backup-cmd/main.go GOOS=linux GOARCH=amd64 go build -o "dist/linux-amd64/soham/whatsapp-server.o" -v -ldflags="-s -w" ./servers/soham/whatsapp-server/main.go GOOS=linux GOARCH=amd64 go build -o "dist/linux-amd64/soham/whatsapp-client.o" -v -ldflags="-s -w" ./servers/soham/whatsapp-client/main.go +GOOS=linux GOARCH=amd64 go build -o "dist/linux-amd64/file-server.o" -v -ldflags="-s -w" ./servers/file-server-middleware/main.go diff --git a/release/soham/whatsapp-client.go b/release/soham/whatsapp-client.go index 74e66a8..0381c3c 100644 --- a/release/soham/whatsapp-client.go +++ b/release/soham/whatsapp-client.go @@ -16,6 +16,8 @@ import ( "runtime" "slices" "time" + + utility_functions_gzip "github.com/rpsoftech/golang-servers/utility/functions/gzip" ) const ( @@ -58,12 +60,12 @@ func main() { buildFilePath = "../../servers/soham/whatsapp-client/main.go" } - serverBinary := "whatsapp-client.o" + serverBinaryName := "whatsapp-client.o" if runtime.GOOS == "windows" { archs = append(archs, "386") - serverBinary = "whatsapp-client.exe" + serverBinaryName = "whatsapp-client.exe" } - serverBinaryPath := filepath.Join("build", serverBinary) + serverBinaryPath := filepath.Join("build", serverBinaryName) for _, arch := range archs { fmt.Printf("Building server for %s...", arch) cmd := exec.Command( @@ -85,24 +87,26 @@ func main() { if err != nil { panic(err) } - + gzipFilePath := serverBinaryPath + ".gz" + gzipFileName := serverBinaryName + ".gz" + utility_functions_gzip.GzipCompressFile(serverBinaryPath, gzipFilePath) fmt.Println("Calculating SHA256...") - hash, err := sha256File(serverBinaryPath) + hash, err := sha256File(gzipFilePath) if err != nil { panic(err) } // https://files.rpso.in/static/soham/wbot/darwin_amd64/whatsapp-client.o versionInfo := VersionInfo{ Version: atoi(version), - URL: fmt.Sprintf("https://files.rpso.in/static/soham/wbot/%s_%s/%s", runtime.GOOS, arch, serverBinary), + URL: fmt.Sprintf("https://files.rpso.in/static/soham/wbot/%s_%s/%s", runtime.GOOS, arch, gzipFileName), SHA256: hash, } - data, _ := json.MarshalIndent(versionInfo, "", " ") + data, _ := json.MarshalIndent(versionInfo, "", " ") fmt.Println("Uploading server binary...") - err = uploadFile(serverBinaryPath, serverBinary, fmt.Sprintf("soham/wbot/%s_%s", runtime.GOOS, arch)) + err = uploadFile(gzipFilePath, gzipFileName, fmt.Sprintf("soham/wbot/%s_%s", runtime.GOOS, arch)) // uploadFile(serverBinaryPath, "https://fileserver.com/server_v"+version) if err != nil { panic(err) @@ -114,9 +118,9 @@ func main() { if err != nil { panic(err) } + fmt.Printf("Uploaded %s", data) // uploadFile(versionFile, "https://kvserver.com/version.json") } - fmt.Println("Build and upload complete") } diff --git a/servers/bullion/dbcreation/main.go b/servers/bullion/dbcreation/main.go new file mode 100644 index 0000000..7905807 --- /dev/null +++ b/servers/bullion/dbcreation/main.go @@ -0,0 +1,5 @@ +package main + +func main() { + +} diff --git a/servers/bullion/dbcreation/sql.template b/servers/bullion/dbcreation/sql.template new file mode 100644 index 0000000..7627063 --- /dev/null +++ b/servers/bullion/dbcreation/sql.template @@ -0,0 +1,579 @@ +CREATE DATABASE IF NOT EXISTS `@datbasename@`; +USE `@datbasename@`; +/*!40100 DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci */ +/*!80016 DEFAULT ENCRYPTION='N' */; +/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; +/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; +/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */; +/*!50503 SET NAMES utf8 */; +/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */; +/*!40103 SET TIME_ZONE='+00:00' */; +/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */; +/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */; +/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */; +/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */; + +-- +-- Table structure for table `AdminLogins` +-- + +DROP TABLE IF EXISTS `AdminLogins`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `AdminLogins` ( + `al_id` int NOT NULL AUTO_INCREMENT, + `al_user_id` varchar(50) NOT NULL, + `al_user_email` varchar(256) NOT NULL, + `al_password` varchar(256) NOT NULL, + `al_extra` json NOT NULL, + `al_edited_on` int NOT NULL, + PRIMARY KEY (`al_id`), + UNIQUE KEY `al_user_id` (`al_user_id`), + UNIQUE KEY `al_user_email` (`al_user_email`), + KEY `al_password` (`al_password`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `CalcBase` +-- + +DROP TABLE IF EXISTS `CalcBase`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `CalcBase` ( + `calc_base_id` int NOT NULL AUTO_INCREMENT, + `calc_base_name` varchar(45) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL, + `calc_base_variables` json NOT NULL, + `calc_base_string` varchar(512) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL, + `calc_base_created_at` int NOT NULL, + PRIMARY KEY (`calc_base_id`), + UNIQUE KEY `name_UNIQUE` (`calc_base_name`), + KEY `calc_base_created_at` (`calc_base_created_at`) +) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `CalcStringsHistory` +-- + +DROP TABLE IF EXISTS `CalcStringsHistory`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `CalcStringsHistory` ( + `csh_id` int NOT NULL AUTO_INCREMENT, + `csh_calc_base_id` int NOT NULL, + `csh_variable_snapshot` json NOT NULL, + `csh_gen_strings` json NOT NULL, + `csh_created_on` int NOT NULL, + PRIMARY KEY (`csh_id`), + KEY `csh_calc_base_id` (`csh_calc_base_id`), + KEY `csh_created_on` (`csh_created_on`), + CONSTRAINT `CalcStringsHistory_ibfk_1` FOREIGN KEY (`csh_calc_base_id`) REFERENCES `CalcBase` (`calc_base_id`) ON DELETE CASCADE ON UPDATE CASCADE +) ENGINE=InnoDB AUTO_INCREMENT=6357 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `FeedsAndUpdates` +-- + +DROP TABLE IF EXISTS `FeedsAndUpdates`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `FeedsAndUpdates` ( + `fau_id` int NOT NULL AUTO_INCREMENT, + `fau_title` varchar(100) NOT NULL, + `fau_is_html` enum('Y','N') NOT NULL DEFAULT 'N', + `fau_desc` text NOT NULL, + `fau_created_at` int NOT NULL, + PRIMARY KEY (`fau_id`), + KEY `fau_is_html` (`fau_is_html`), + KEY `fau_created_at` (`fau_created_at`) +) ENGINE=InnoDB AUTO_INCREMENT=20 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `MetaTradesBooking` +-- + +DROP TABLE IF EXISTS `MetaTradesBooking`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `MetaTradesBooking` ( + `meta_deal` int NOT NULL, + `meta_base_symbole` varchar(50) NOT NULL, + `meta_machine_id` varchar(45) DEFAULT 'machineid1', + `meta_buy_sell` enum('buy','sell') NOT NULL, + `meta_price` decimal(12,2) NOT NULL, + `meta_comment` text NOT NULL, + `meta_volume` decimal(6,1) NOT NULL, + `meta_extra` json NOT NULL, + `meta_time` int NOT NULL, + PRIMARY KEY (`meta_deal`), + KEY `meta_base_symbole` (`meta_base_symbole`), + KEY `meta_buy_sell` (`meta_buy_sell`), + KEY `meta_price` (`meta_price`), + KEY `meta_volume` (`meta_volume`), + KEY `meta_time` (`meta_time`), + KEY `machineid2` (`meta_machine_id`), + CONSTRAINT `MetaTradesBooking_ibfk_1` FOREIGN KEY (`meta_deal`) REFERENCES `OrderIdSummerys` (`ois_id`) ON DELETE RESTRICT ON UPDATE RESTRICT +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `NotificationTokens` +-- + +DROP TABLE IF EXISTS `NotificationTokens`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `NotificationTokens` ( + `noti_token_id` int NOT NULL AUTO_INCREMENT, + `noti_uuid` varchar(256) NOT NULL, + `noti_token` varchar(256) NOT NULL, + `noti_otr_id` int NOT NULL, + `noti_edited_on` int NOT NULL, + PRIMARY KEY (`noti_token_id`), + UNIQUE KEY `noti_uuid` (`noti_uuid`), + UNIQUE KEY `noti_token` (`noti_token`), + KEY `noti_edited_on` (`noti_edited_on`), + KEY `noti_otr_id` (`noti_otr_id`), + CONSTRAINT `NotificationTokens_ibfk_1` FOREIGN KEY (`noti_otr_id`) REFERENCES `OneTimeRegistration` (`otr_id`) ON DELETE CASCADE ON UPDATE CASCADE +) ENGINE=InnoDB AUTO_INCREMENT=73039 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `OneTimeRegistration` +-- + +DROP TABLE IF EXISTS `OneTimeRegistration`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `OneTimeRegistration` ( + `otr_id` int NOT NULL AUTO_INCREMENT, + `otr_name` varchar(256) NOT NULL, + `otr_number` varchar(10) NOT NULL, + `otr_firmname` varchar(256) NOT NULL, + `is_auto_reg` enum('Y','N') CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL DEFAULT 'N', + `otr_device` enum('A','I','DW','MW') NOT NULL, + `otr_extra` json DEFAULT NULL, + `otr_created_on` int NOT NULL, + PRIMARY KEY (`otr_id`), + KEY `otr_created_on` (`otr_created_on`), + KEY `otr_name` (`otr_name`), + KEY `otr_number` (`otr_number`), + KEY `otr_firmname` (`otr_firmname`), + KEY `otr_device` (`otr_device`), + KEY `is_auto_reg` (`is_auto_reg`) +) ENGINE=InnoDB AUTO_INCREMENT=117757 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `OrderHistory` +-- + +DROP TABLE IF EXISTS `OrderHistory`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `OrderHistory` ( + `oh_id` int NOT NULL AUTO_INCREMENT, + `oh_second_id` varchar(40) NOT NULL, + `oh_user_id` int NOT NULL, + `oh_product_name` varchar(100) NOT NULL, + `oh_order_type` enum('market','limit') NOT NULL, + `oh_buy_sell` enum('B','S') NOT NULL, + `oh_pgm_id` int NOT NULL, + `oh_orders_status` int NOT NULL, + `oh_volume` decimal(6,2) NOT NULL, + `oh_weight` int NOT NULL, + `oh_weight_delivered` int DEFAULT NULL, + `oh_price` decimal(10,2) NOT NULL, + `oh_mcx_price` decimal(10,2) DEFAULT NULL, + `oh_calc_id` int DEFAULT NULL, + `oh_extra` json DEFAULT NULL, + `oh_machineid` varchar(10) NOT NULL, + `oh_executed_on` int DEFAULT NULL, + `oh_created_at` int NOT NULL, + `oh_edited_on` int NOT NULL, + PRIMARY KEY (`oh_id`), + UNIQUE KEY `oh_second_id` (`oh_second_id`), + KEY `oh_order_type` (`oh_order_type`), + KEY `oh_buy_sell` (`oh_buy_sell`), + KEY `oh_volume` (`oh_volume`), + KEY `oh_weight` (`oh_weight`), + KEY `oh_price` (`oh_price`), + KEY `oh_mcx_price` (`oh_mcx_price`), + KEY `oh_executed_on` (`oh_executed_on`), + KEY `oh_created_at` (`oh_created_at`), + KEY `oh_edited_on` (`oh_edited_on`), + KEY `oh_pgm_id` (`oh_pgm_id`), + KEY `oh_calc_id` (`oh_calc_id`), + KEY `oh_orders_status` (`oh_orders_status`), + KEY `oh_machineid` (`oh_machineid`), + KEY `oh_product_name` (`oh_product_name`), + KEY `OrderHistory_ibfk_1` (`oh_user_id`), + CONSTRAINT `OrderHistory_ibfk_1` FOREIGN KEY (`oh_user_id`) REFERENCES `Users` (`user_id`) ON DELETE CASCADE, + CONSTRAINT `OrderHistory_ibfk_2` FOREIGN KEY (`oh_pgm_id`) REFERENCES `ProductGroupsMap` (`pgm_id`), + CONSTRAINT `OrderHistory_ibfk_3` FOREIGN KEY (`oh_calc_id`) REFERENCES `CalcStringsHistory` (`csh_id`) ON DELETE RESTRICT ON UPDATE RESTRICT, + CONSTRAINT `OrderHistory_ibfk_4` FOREIGN KEY (`oh_orders_status`) REFERENCES `OrderStatus` (`os_id`) ON DELETE RESTRICT ON UPDATE RESTRICT, + CONSTRAINT `OrderHistory_ibfk_5` FOREIGN KEY (`oh_id`) REFERENCES `OrderIdSummerys` (`ois_id`) ON DELETE RESTRICT ON UPDATE RESTRICT +) ENGINE=InnoDB AUTO_INCREMENT=19562 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `OrderIdSummerys` +-- + +DROP TABLE IF EXISTS `OrderIdSummerys`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `OrderIdSummerys` ( + `ois_id` int NOT NULL AUTO_INCREMENT, + PRIMARY KEY (`ois_id`) +) ENGINE=InnoDB AUTO_INCREMENT=19563 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `OrderStatus` +-- + +DROP TABLE IF EXISTS `OrderStatus`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `OrderStatus` ( + `os_id` int NOT NULL AUTO_INCREMENT, + `os_status_name` varchar(45) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL, + `os_name_display` varchar(45) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL, + `os_color_code` varchar(9) DEFAULT NULL, + PRIMARY KEY (`os_id`), + UNIQUE KEY `status_name_UNIQUE` (`os_status_name`) +) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `Popups` +-- + +DROP TABLE IF EXISTS `Popups`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `Popups` ( + `pop_id` int NOT NULL AUTO_INCREMENT, + `pop_starts_at` int NOT NULL, + `pop_ends_at` int NOT NULL, + `pop_url` text NOT NULL, + `pop_type` enum('O','E','D') NOT NULL, + `pop_is_active` enum('A','I') NOT NULL, + `pop_created_at` int NOT NULL, + PRIMARY KEY (`pop_id`), + KEY `pop_starts_at` (`pop_starts_at`), + KEY `pop_ends_at` (`pop_ends_at`), + KEY `pop_type` (`pop_type`), + KEY `pop_is_active` (`pop_is_active`), + KEY `pop_created_at` (`pop_created_at`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `ProductGroupsMap` +-- + +DROP TABLE IF EXISTS `ProductGroupsMap`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `ProductGroupsMap` ( + `pgm_id` int NOT NULL AUTO_INCREMENT, + `pgm_pid` int NOT NULL, + `pgm_gid` int NOT NULL, + `p_is_active` tinyint NOT NULL DEFAULT '0', + `p_is_trading_available` tinyint NOT NULL DEFAULT '0', + `p_extra` json DEFAULT NULL, + `pgm_edited_on` int NOT NULL, + PRIMARY KEY (`pgm_id`), + UNIQUE KEY `pgm_pid` (`pgm_pid`,`pgm_gid`), + KEY `pgm_gid` (`pgm_gid`), + KEY `p_is_active` (`p_is_active`), + KEY `p_is_trading_available` (`p_is_trading_available`), + KEY `pgm_edited_on` (`pgm_edited_on`), + CONSTRAINT `ProductGroupsMap_ibfk_1` FOREIGN KEY (`pgm_pid`) REFERENCES `ProductList` (`pid`) ON DELETE CASCADE ON UPDATE CASCADE, + CONSTRAINT `ProductGroupsMap_ibfk_2` FOREIGN KEY (`pgm_gid`) REFERENCES `UserGroups` (`user_groups_id`) ON DELETE CASCADE ON UPDATE CASCADE +) ENGINE=InnoDB AUTO_INCREMENT=115 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `ProductList` +-- + +DROP TABLE IF EXISTS `ProductList`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `ProductList` ( + `pid` int NOT NULL AUTO_INCREMENT, + `pl_name` varchar(45) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL, + `pl_name_alias` varchar(50) DEFAULT NULL, + `pl_base_symbole` varchar(45) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL, + `pl_calculated_on` varchar(45) DEFAULT NULL, + `pl_is_calculated` tinyint NOT NULL DEFAULT '1', + `pl_is_active` tinyint NOT NULL DEFAULT '0', + `pl_hedging` int NOT NULL DEFAULT '0', + `pl_csh_id` int NOT NULL, + `pl_show_in` enum('comex','product','base') CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL, + `pl_number_tofix` int NOT NULL DEFAULT '0', + `pl_created_at` int NOT NULL, + PRIMARY KEY (`pid`), + UNIQUE KEY `name_UNIQUE` (`pl_name`), + UNIQUE KEY `pl_name_alias` (`pl_name_alias`), + KEY `p_base_symbole` (`pl_base_symbole`), + KEY `pl_show_in` (`pl_show_in`), + KEY `pl_is_active` (`pl_is_active`), + KEY `pl_is_calculated` (`pl_is_calculated`), + KEY `pl_csh_id` (`pl_csh_id`), + KEY `pl_number_tofix` (`pl_number_tofix`), + KEY `pl_calculated_on` (`pl_calculated_on`), + KEY `pl_hedging` (`pl_hedging`), + CONSTRAINT `ProductList_ibfk_1` FOREIGN KEY (`pl_csh_id`) REFERENCES `CalcStringsHistory` (`csh_id`) +) ENGINE=InnoDB AUTO_INCREMENT=85 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT=' '; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `RateAlerts` +-- + +DROP TABLE IF EXISTS `RateAlerts`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `RateAlerts` ( + `alert_id` int NOT NULL AUTO_INCREMENT, + `alert_pid` int NOT NULL, + `alert_price_type` enum('B','S') NOT NULL, + `alert_price` decimal(10,2) NOT NULL, + `alert_is_active` enum('Y','N') NOT NULL, + `alert_placed_by` int NOT NULL, + `alert_passed_by` int DEFAULT NULL, + `alert_created_at` int NOT NULL, + PRIMARY KEY (`alert_id`), + KEY `alert_created_at` (`alert_created_at`), + KEY `alert_passed_by` (`alert_passed_by`), + KEY `alert_is_active` (`alert_is_active`), + KEY `alert_price` (`alert_price`), + KEY `alert_price_type` (`alert_price_type`), + KEY `alert_placed_by` (`alert_placed_by`), + CONSTRAINT `RateAlerts_ibfk_1` FOREIGN KEY (`alert_placed_by`) REFERENCES `OneTimeRegistration` (`otr_id`) ON DELETE CASCADE ON UPDATE CASCADE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `SiteBasicDetails` +-- + +DROP TABLE IF EXISTS `SiteBasicDetails`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `SiteBasicDetails` ( + `sbd_id` int NOT NULL AUTO_INCREMENT, + `sbd_key` varchar(45) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL, + `sbd_value` json NOT NULL, + `sbd_created_at` int NOT NULL, + `sbd_edited_on` int NOT NULL, + PRIMARY KEY (`sbd_id`), + UNIQUE KEY `key_UNIQUE` (`sbd_key`) +) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `UserGroups` +-- + +DROP TABLE IF EXISTS `UserGroups`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `UserGroups` ( + `user_groups_id` int NOT NULL AUTO_INCREMENT, + `user_group_name` varchar(60) NOT NULL, + `user_group_login_active` tinyint(1) NOT NULL DEFAULT '0', + `user_group_trade_active` tinyint(1) NOT NULL DEFAULT '0', + `user_group_extra` json DEFAULT NULL, + PRIMARY KEY (`user_groups_id`), + UNIQUE KEY `user_group_name` (`user_group_name`), + KEY `user_group_login_active` (`user_group_login_active`), + KEY `user_group_trade_active` (`user_group_trade_active`) +) ENGINE=InnoDB AUTO_INCREMENT=16 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `Users` +-- + +DROP TABLE IF EXISTS `Users`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `Users` ( + `user_id` int NOT NULL AUTO_INCREMENT, + `user_uniq_id` varchar(40) DEFAULT NULL, + `user_name` varchar(50) NOT NULL, + `user_password` text NOT NULL, + `user_number` varchar(10) DEFAULT NULL, + `user_email` varchar(100) DEFAULT NULL, + `user_active` enum('A','I') NOT NULL, + `user_groupid` int NOT NULL DEFAULT '1', + `user_extra` json NOT NULL, + `user_margins` json DEFAULT NULL, + `user_edited_on` int NOT NULL, + PRIMARY KEY (`user_id`), + UNIQUE KEY `user_uniq_id` (`user_uniq_id`), + UNIQUE KEY `user_email` (`user_email`), + KEY `user_name` (`user_name`), + KEY `user_groups` (`user_groupid`), + KEY `user_edited_on` (`user_edited_on`), + KEY `user_active` (`user_active`), + CONSTRAINT `Users_ibfk_1` FOREIGN KEY (`user_groupid`) REFERENCES `UserGroups` (`user_groups_id`) ON DELETE RESTRICT ON UPDATE RESTRICT +) ENGINE=InnoDB AUTO_INCREMENT=1859 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Temporary view structure for view `meta_summary` +-- + +DROP TABLE IF EXISTS `meta_summary`; +/*!50001 DROP VIEW IF EXISTS `meta_summary`*/; +SET @saved_cs_client = @@character_set_client; +/*!50503 SET character_set_client = utf8mb4 */; +/*!50001 CREATE VIEW `meta_summary` AS SELECT + 1 AS `symbole`, + 1 AS `machineid`, + 1 AS `buy_sell`, + 1 AS `volume`, + 1 AS `avg_price`, + 1 AS `total_orders`, + 1 AS `date`, + 1 AS `meta_time`*/; +SET character_set_client = @saved_cs_client; + +-- +-- Temporary view structure for view `order_summary` +-- + +DROP TABLE IF EXISTS `order_summary`; +/*!50001 DROP VIEW IF EXISTS `order_summary`*/; +SET @saved_cs_client = @@character_set_client; +/*!50503 SET character_set_client = utf8mb4 */; +/*!50001 CREATE VIEW `order_summary` AS SELECT + 1 AS `product`, + 1 AS `pid`, + 1 AS `base_symbole`, + 1 AS `buy_sell`, + 1 AS `weight`, + 1 AS `avg_price`, + 1 AS `mcx_avg_price`, + 1 AS `total_orders`, + 1 AS `date`, + 1 AS `time`*/; +SET character_set_client = @saved_cs_client; + +-- +-- Final view structure for view `meta_summary` +-- + +/*!50001 DROP VIEW IF EXISTS `meta_summary`*/; +/*!50001 SET @saved_cs_client = @@character_set_client */; +/*!50001 SET @saved_cs_results = @@character_set_results */; +/*!50001 SET @saved_col_connection = @@collation_connection */; +/*!50001 SET character_set_client = utf8mb4 */; +/*!50001 SET character_set_results = utf8mb4 */; +/*!50001 SET collation_connection = utf8mb4_0900_ai_ci */; +/*!50001 CREATE ALGORITHM=UNDEFINED */ +/*!50013 DEFINER=`keyur`@`%` SQL SECURITY DEFINER */ +/*!50001 VIEW `meta_summary` AS select `MetaTradesBooking`.`meta_base_symbole` AS `symbole`,`MetaTradesBooking`.`meta_machine_id` AS `machineid`,`MetaTradesBooking`.`meta_buy_sell` AS `buy_sell`,sum(`MetaTradesBooking`.`meta_volume`) AS `volume`,(sum((`MetaTradesBooking`.`meta_price` * `MetaTradesBooking`.`meta_volume`)) / sum(`MetaTradesBooking`.`meta_volume`)) AS `avg_price`,count(0) AS `total_orders`,date_format(from_unixtime(`MetaTradesBooking`.`meta_time`),'%D-%M-%Y') AS `date`,max(`MetaTradesBooking`.`meta_time`) AS `meta_time` from `MetaTradesBooking` group by `MetaTradesBooking`.`meta_machine_id`,date_format(from_unixtime(`MetaTradesBooking`.`meta_time`),'%D-%M-%Y'),`MetaTradesBooking`.`meta_base_symbole`,`MetaTradesBooking`.`meta_buy_sell` */; +/*!50001 SET character_set_client = @saved_cs_client */; +/*!50001 SET character_set_results = @saved_cs_results */; +/*!50001 SET collation_connection = @saved_col_connection */; + +-- +-- Final view structure for view `order_summary` +-- + +/*!50001 DROP VIEW IF EXISTS `order_summary`*/; +/*!50001 SET @saved_cs_client = @@character_set_client */; +/*!50001 SET @saved_cs_results = @@character_set_results */; +/*!50001 SET @saved_col_connection = @@collation_connection */; +/*!50001 SET character_set_client = utf8mb4 */; +/*!50001 SET character_set_results = utf8mb4 */; +/*!50001 SET collation_connection = utf8mb4_0900_ai_ci */; +/*!50001 CREATE ALGORITHM=UNDEFINED */ +/*!50013 DEFINER=`keyur`@`%` SQL SECURITY DEFINER */ +/*!50001 VIEW `order_summary` AS select `OrderHistory`.`oh_product_name` AS `product`,`ProductGroupsMap`.`pgm_pid` AS `pid`,`ProductList`.`pl_base_symbole` AS `base_symbole`,`OrderHistory`.`oh_buy_sell` AS `buy_sell`,sum(`OrderHistory`.`oh_weight`) AS `weight`,(sum((`OrderHistory`.`oh_price` * `OrderHistory`.`oh_weight`)) / sum(`OrderHistory`.`oh_weight`)) AS `avg_price`,(sum((`OrderHistory`.`oh_mcx_price` * `OrderHistory`.`oh_weight`)) / sum(`OrderHistory`.`oh_weight`)) AS `mcx_avg_price`,count(0) AS `total_orders`,date_format(from_unixtime(`OrderHistory`.`oh_created_at`),'%D-%M-%Y') AS `date`,max(`OrderHistory`.`oh_created_at`) AS `time` from ((`OrderHistory` join `ProductGroupsMap` on((`OrderHistory`.`oh_pgm_id` = `ProductGroupsMap`.`pgm_id`))) join `ProductList` on((`ProductGroupsMap`.`pgm_pid` = `ProductList`.`pid`))) where (`OrderHistory`.`oh_orders_status` in (1,4,6,7)) group by date_format(from_unixtime(`OrderHistory`.`oh_created_at`),'%D-%M-%Y'),`OrderHistory`.`oh_product_name`,`ProductList`.`pid`,`OrderHistory`.`oh_buy_sell` */; +/*!50001 SET character_set_client = @saved_cs_client */; +/*!50001 SET character_set_results = @saved_cs_results */; +/*!50001 SET collation_connection = @saved_col_connection */; +/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */; + +/*!40101 SET SQL_MODE=@OLD_SQL_MODE */; +/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */; +/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */; +/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */; +/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */; +/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; +/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; + +-- Dump completed on 2026-04-04 10:46:15 + + +USE `@datbasename@`; + +/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; +/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; +/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */; +/*!50503 SET NAMES utf8 */; +/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */; +/*!40103 SET TIME_ZONE='+00:00' */; +/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */; +/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */; +/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */; +/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */; + + +LOCK TABLES `CalcBase` WRITE; +/*!40000 ALTER TABLE `CalcBase` DISABLE KEYS */; +INSERT INTO `CalcBase` VALUES (0,'without_calc','[]','{{symbole}}',1600440000),(1,'with_gst','[\"tax\", \"premium\"]','({{symbole}}+{{premium}})*(1+({{tax}}/100))',1600440044),(2,'fixed_rates','[\"price\"]','{{price}}',1600440044),(3,'import','[\"duty\", \"premium\", \"tax\"]','(((({{symbole}}+{{sprem}})*{{conv}}*{{INR}})+{{duty}}+{{margin}})*(1+({{tax}}/100))/{{div}}*{{mult}})',1600440044); +/*!40000 ALTER TABLE `CalcBase` ENABLE KEYS */; +UNLOCK TABLES; + +LOCK TABLES `CalcStringsHistory` WRITE; +/*!40000 ALTER TABLE `CalcStringsHistory` DISABLE KEYS */; +INSERT INTO `CalcStringsHistory` VALUES (0,0,'[]','{\"buy\": \"{{symbole}}\", \"sell\": \"{{symbole}}\"}',1212121212); +/*!40000 ALTER TABLE `CalcStringsHistory` ENABLE KEYS */; +UNLOCK TABLES; + +LOCK TABLES `FeedsAndUpdates` WRITE; +/*!40000 ALTER TABLE `FeedsAndUpdates` DISABLE KEYS */; +INSERT INTO `FeedsAndUpdates` VALUES (1,'Welcome','Y','

Welcome To Shiv Bullion

',1658097566); +/*!40000 ALTER TABLE `FeedsAndUpdates` ENABLE KEYS */; +UNLOCK TABLES; + +LOCK TABLES `OrderStatus` WRITE; +/*!40000 ALTER TABLE `OrderStatus` DISABLE KEYS */; +INSERT INTO `OrderStatus` VALUES (1,'order_placed','Order Placed',NULL),(2,'limit_expired','Limit Expired',NULL),(3,'limit_placed','Limit Placed',NULL),(4,'limit_passed','Limit Passed',NULL),(5,'limit_canceled','Limit Cancelled',NULL),(6,'delivered','Order Delivered',NULL),(7,'partial_delivered','Partial Delivered',NULL); +/*!40000 ALTER TABLE `OrderStatus` ENABLE KEYS */; +UNLOCK TABLES; + + +LOCK TABLES `ProductList` WRITE; +/*!40000 ALTER TABLE `ProductList` DISABLE KEYS */; +INSERT INTO `ProductList` VALUES (1,'GOLD SPOT',NULL,'GOLD_SPOT','GOLD_SPOT',0,1,0,0,'comex',2,1699191374),(2,'SILVER SPOT',NULL,'SILVER_SPOT','SILVER_SPOT',0,1,0,0,'comex',2,1655269254),(3,'INR SPOT',NULL,'INR','INR',0,1,0,0,'comex',4,1655821674),(4,'GOLD FUTURE',NULL,'GOLD_MCX','GOLD_MCX',0,1,0,0,'base',0,1756451981),(5,'SILVER FUTURE',NULL,'SILVER_MCX','SILVER_MCX',0,1,0,0,'base',0,1756451979),(6,'GOLD NEXT',NULL,'GOLD_NEXT','GOLD_NEXT',0,0,0,0,'base',0,1756444213),(7,'SILVER NEXT',NULL,'SILVER_NEXT','SILVER_NEXT',0,0,0,0,'base',0,1772168914); +/*!40000 ALTER TABLE `ProductList` ENABLE KEYS */; +UNLOCK TABLES; + +LOCK TABLES `UserGroups` WRITE; +/*!40000 ALTER TABLE `UserGroups` DISABLE KEYS */; +INSERT INTO `UserGroups` VALUES (1,'ALL',1,1,'{\"replace_strings\": {\"GOLD\": {\"buy\": 0, \"sell\": 0}, \"SILVER\": {\"buy\": 0, \"sell\": 0}}}'); +/*!40000 ALTER TABLE `UserGroups` ENABLE KEYS */; +UNLOCK TABLES; +/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */; + +/*!40101 SET SQL_MODE=@OLD_SQL_MODE */; +/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */; +/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */; +/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */; +/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */; +/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; +/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; diff --git a/servers/bullion/main-server/repos/admin-user.repo.go b/servers/bullion/main-server/repos/admin-user.repo.go index 9b19285..914c491 100644 --- a/servers/bullion/main-server/repos/admin-user.repo.go +++ b/servers/bullion/main-server/repos/admin-user.repo.go @@ -9,8 +9,8 @@ import ( "github.com/rpsoftech/golang-servers/interfaces" bullion_main_server_interfaces "github.com/rpsoftech/golang-servers/servers/bullion/main-server/interfaces" "github.com/rpsoftech/golang-servers/utility/mongodb" - "go.mongodb.org/mongo-driver/bson" - "go.mongodb.org/mongo-driver/mongo" + "go.mongodb.org/mongo-driver/v2/bson" + "go.mongodb.org/mongo-driver/v2/mongo" ) type AdminUserRepoStruct struct { diff --git a/servers/bullion/main-server/repos/bank-details.repo.go b/servers/bullion/main-server/repos/bank-details.repo.go index 4147235..a3eb970 100644 --- a/servers/bullion/main-server/repos/bank-details.repo.go +++ b/servers/bullion/main-server/repos/bank-details.repo.go @@ -10,9 +10,9 @@ import ( bullion_main_server_interfaces "github.com/rpsoftech/golang-servers/servers/bullion/main-server/interfaces" utility_functions "github.com/rpsoftech/golang-servers/utility/functions" "github.com/rpsoftech/golang-servers/utility/mongodb" - "go.mongodb.org/mongo-driver/bson" - "go.mongodb.org/mongo-driver/mongo" - "go.mongodb.org/mongo-driver/mongo/options" + "go.mongodb.org/mongo-driver/v2/bson" + "go.mongodb.org/mongo-driver/v2/mongo" + "go.mongodb.org/mongo-driver/v2/mongo/options" ) type ( diff --git a/servers/bullion/main-server/repos/bank-rate-calc.repo.go b/servers/bullion/main-server/repos/bank-rate-calc.repo.go index 84cadef..6d05e21 100644 --- a/servers/bullion/main-server/repos/bank-rate-calc.repo.go +++ b/servers/bullion/main-server/repos/bank-rate-calc.repo.go @@ -11,8 +11,8 @@ import ( bullion_main_server_interfaces "github.com/rpsoftech/golang-servers/servers/bullion/main-server/interfaces" "github.com/rpsoftech/golang-servers/utility/mongodb" "github.com/rpsoftech/golang-servers/utility/redis" - "go.mongodb.org/mongo-driver/bson" - "go.mongodb.org/mongo-driver/mongo" + "go.mongodb.org/mongo-driver/v2/bson" + "go.mongodb.org/mongo-driver/v2/mongo" ) type BankRateCalcRepoStruct struct { diff --git a/servers/bullion/main-server/repos/bullion-site-info.repo.go b/servers/bullion/main-server/repos/bullion-site-info.repo.go index 2d99ed4..803a354 100644 --- a/servers/bullion/main-server/repos/bullion-site-info.repo.go +++ b/servers/bullion/main-server/repos/bullion-site-info.repo.go @@ -9,8 +9,8 @@ import ( "github.com/rpsoftech/golang-servers/interfaces" bullion_main_server_interfaces "github.com/rpsoftech/golang-servers/servers/bullion/main-server/interfaces" "github.com/rpsoftech/golang-servers/utility/mongodb" - "go.mongodb.org/mongo-driver/bson" - "go.mongodb.org/mongo-driver/mongo" + "go.mongodb.org/mongo-driver/v2/bson" + "go.mongodb.org/mongo-driver/v2/mongo" ) type BullionSiteInfoRepoStruct struct { diff --git a/servers/bullion/main-server/repos/event.repo.go b/servers/bullion/main-server/repos/event.repo.go index 31ac0dc..26d8f54 100644 --- a/servers/bullion/main-server/repos/event.repo.go +++ b/servers/bullion/main-server/repos/event.repo.go @@ -8,7 +8,7 @@ import ( "github.com/rpsoftech/golang-servers/interfaces" bullion_main_server_events "github.com/rpsoftech/golang-servers/servers/bullion/main-server/events" "github.com/rpsoftech/golang-servers/utility/mongodb" - "go.mongodb.org/mongo-driver/mongo" + "go.mongodb.org/mongo-driver/v2/mongo" ) type EventRepoStruct struct { diff --git a/servers/bullion/main-server/repos/feeds.repo.go b/servers/bullion/main-server/repos/feeds.repo.go index 7478017..193fb0b 100644 --- a/servers/bullion/main-server/repos/feeds.repo.go +++ b/servers/bullion/main-server/repos/feeds.repo.go @@ -10,9 +10,9 @@ import ( bullion_main_server_interfaces "github.com/rpsoftech/golang-servers/servers/bullion/main-server/interfaces" utility_functions "github.com/rpsoftech/golang-servers/utility/functions" "github.com/rpsoftech/golang-servers/utility/mongodb" - "go.mongodb.org/mongo-driver/bson" - "go.mongodb.org/mongo-driver/mongo" - "go.mongodb.org/mongo-driver/mongo/options" + "go.mongodb.org/mongo-driver/v2/bson" + "go.mongodb.org/mongo-driver/v2/mongo" + "go.mongodb.org/mongo-driver/v2/mongo/options" ) type ( diff --git a/servers/bullion/main-server/repos/general-user-req.repo.go b/servers/bullion/main-server/repos/general-user-req.repo.go index 1b84f6f..971cfe8 100644 --- a/servers/bullion/main-server/repos/general-user-req.repo.go +++ b/servers/bullion/main-server/repos/general-user-req.repo.go @@ -10,8 +10,8 @@ import ( bullion_main_server_interfaces "github.com/rpsoftech/golang-servers/servers/bullion/main-server/interfaces" utility_functions "github.com/rpsoftech/golang-servers/utility/functions" "github.com/rpsoftech/golang-servers/utility/mongodb" - "go.mongodb.org/mongo-driver/bson" - "go.mongodb.org/mongo-driver/mongo" + "go.mongodb.org/mongo-driver/v2/bson" + "go.mongodb.org/mongo-driver/v2/mongo" ) type GeneralUserReqRepoStruct struct { diff --git a/servers/bullion/main-server/repos/general-user.repo.go b/servers/bullion/main-server/repos/general-user.repo.go index 03fb3f4..fffedd0 100644 --- a/servers/bullion/main-server/repos/general-user.repo.go +++ b/servers/bullion/main-server/repos/general-user.repo.go @@ -9,8 +9,8 @@ import ( "github.com/rpsoftech/golang-servers/interfaces" bullion_main_server_interfaces "github.com/rpsoftech/golang-servers/servers/bullion/main-server/interfaces" "github.com/rpsoftech/golang-servers/utility/mongodb" - "go.mongodb.org/mongo-driver/bson" - "go.mongodb.org/mongo-driver/mongo" + "go.mongodb.org/mongo-driver/v2/bson" + "go.mongodb.org/mongo-driver/v2/mongo" ) type GeneralUserRepoStruct struct { diff --git a/servers/bullion/main-server/repos/order.repo.go b/servers/bullion/main-server/repos/order.repo.go index 2d7500c..e2c9f31 100644 --- a/servers/bullion/main-server/repos/order.repo.go +++ b/servers/bullion/main-server/repos/order.repo.go @@ -11,9 +11,9 @@ import ( bullion_main_server_interfaces "github.com/rpsoftech/golang-servers/servers/bullion/main-server/interfaces" utility_functions "github.com/rpsoftech/golang-servers/utility/functions" "github.com/rpsoftech/golang-servers/utility/mongodb" - "go.mongodb.org/mongo-driver/bson" - "go.mongodb.org/mongo-driver/mongo" - "go.mongodb.org/mongo-driver/mongo/options" + "go.mongodb.org/mongo-driver/v2/bson" + "go.mongodb.org/mongo-driver/v2/mongo" + "go.mongodb.org/mongo-driver/v2/mongo/options" ) type ( diff --git a/servers/bullion/main-server/repos/prduct-group-map.repo.go b/servers/bullion/main-server/repos/prduct-group-map.repo.go index f671358..4a1a07c 100644 --- a/servers/bullion/main-server/repos/prduct-group-map.repo.go +++ b/servers/bullion/main-server/repos/prduct-group-map.repo.go @@ -10,9 +10,9 @@ import ( bullion_main_server_interfaces "github.com/rpsoftech/golang-servers/servers/bullion/main-server/interfaces" utility_functions "github.com/rpsoftech/golang-servers/utility/functions" "github.com/rpsoftech/golang-servers/utility/mongodb" - "go.mongodb.org/mongo-driver/bson" - "go.mongodb.org/mongo-driver/mongo" - "go.mongodb.org/mongo-driver/mongo/options" + "go.mongodb.org/mongo-driver/v2/bson" + "go.mongodb.org/mongo-driver/v2/mongo" + "go.mongodb.org/mongo-driver/v2/mongo/options" ) type ( diff --git a/servers/bullion/main-server/repos/product-repo.go b/servers/bullion/main-server/repos/product-repo.go index ebcfe75..25aba45 100644 --- a/servers/bullion/main-server/repos/product-repo.go +++ b/servers/bullion/main-server/repos/product-repo.go @@ -10,8 +10,8 @@ import ( bullion_main_server_interfaces "github.com/rpsoftech/golang-servers/servers/bullion/main-server/interfaces" utility_functions "github.com/rpsoftech/golang-servers/utility/functions" "github.com/rpsoftech/golang-servers/utility/mongodb" - "go.mongodb.org/mongo-driver/bson" - "go.mongodb.org/mongo-driver/mongo" + "go.mongodb.org/mongo-driver/v2/bson" + "go.mongodb.org/mongo-driver/v2/mongo" ) type ProductRepoStruct struct { diff --git a/servers/bullion/main-server/repos/trade-user-group.repo.go b/servers/bullion/main-server/repos/trade-user-group.repo.go index ef39a0f..e4f2890 100644 --- a/servers/bullion/main-server/repos/trade-user-group.repo.go +++ b/servers/bullion/main-server/repos/trade-user-group.repo.go @@ -10,9 +10,9 @@ import ( bullion_main_server_interfaces "github.com/rpsoftech/golang-servers/servers/bullion/main-server/interfaces" utility_functions "github.com/rpsoftech/golang-servers/utility/functions" "github.com/rpsoftech/golang-servers/utility/mongodb" - "go.mongodb.org/mongo-driver/bson" - "go.mongodb.org/mongo-driver/mongo" - "go.mongodb.org/mongo-driver/mongo/options" + "go.mongodb.org/mongo-driver/v2/bson" + "go.mongodb.org/mongo-driver/v2/mongo" + "go.mongodb.org/mongo-driver/v2/mongo/options" ) type ( diff --git a/servers/bullion/main-server/repos/trade-user.repo.go b/servers/bullion/main-server/repos/trade-user.repo.go index f8e16ec..beb854d 100644 --- a/servers/bullion/main-server/repos/trade-user.repo.go +++ b/servers/bullion/main-server/repos/trade-user.repo.go @@ -12,9 +12,9 @@ import ( utility_functions "github.com/rpsoftech/golang-servers/utility/functions" "github.com/rpsoftech/golang-servers/utility/mongodb" "github.com/rpsoftech/golang-servers/utility/redis" - "go.mongodb.org/mongo-driver/bson" - "go.mongodb.org/mongo-driver/mongo" - "go.mongodb.org/mongo-driver/mongo/options" + "go.mongodb.org/mongo-driver/v2/bson" + "go.mongodb.org/mongo-driver/v2/mongo" + "go.mongodb.org/mongo-driver/v2/mongo/options" ) type ( diff --git a/servers/file-server-middleware/main.go b/servers/file-server-middleware/main.go new file mode 100644 index 0000000..2db64f2 --- /dev/null +++ b/servers/file-server-middleware/main.go @@ -0,0 +1,234 @@ +package main + +import ( + "bytes" + "fmt" + "io" + "log" + "mime/multipart" + "net/http" + "os" + "path/filepath" + "strings" + "time" + + "github.com/google/uuid" // Run: go get github.com/google/uuid + "github.com/rpsoftech/golang-servers/env" +) + +const ( + PUBLIC_DOMAIN = "PUBLIC_DOMAIN" + MAIN_SERVER_URL = "MAIN_SERVER_URL" + MAIN_SERVER_SUB_PATH = "MAIN_SERVER_SUB_PATH" + MAIN_SERVER_TOKEN = "MAIN_SERVER_TOKEN" + CURRENT_SERVER_TOKEN = "CURRENT_SERVER_TOKEN" +) + +type SeverConfig struct { + // The public URL prefix you will return to the user + PublicDomain string `json:"publicDomain" validate:"required"` + // The hidden backend server that actually stores the files + MainServerURL string `json:"mainServerUrl" validate:"required"` + MainServerSubPath string `json:"mainServerSubPath" validate:"required"` + MainServerToken string `json:"mainServerToken" validate:"required"` + CurrentServerToken string `json:"currentServerToken" validate:"required"` +} + +var config SeverConfig + +func uploadHandler(w http.ResponseWriter, r *http.Request) { + token := r.Header.Get(env.XApiToken) + if token == "" || token != config.CurrentServerToken { + http.Error(w, "Invalid Token", http.StatusUnauthorized) + return + } + + if r.Method != http.MethodPost { + http.Error(w, "Method not allowed", http.StatusMethodNotAllowed) + return + } + + reader, err := r.MultipartReader() + if err != nil { + http.Error(w, "Invalid multipart request", http.StatusBadRequest) + return + } + + for { + part, err := reader.NextPart() + if err == io.EOF { + break + } + if err != nil { + http.Error(w, "Error reading stream", http.StatusInternalServerError) + return + } + + if part.FileName() != "" { + ext := filepath.Ext(part.FileName()) + onlyName := uuid.New().String() + newFileName := onlyName + ext + + // ========================================== + // 1. SPOOL FILE TO LOCAL DISK (Saves RAM) + // ========================================== + tmpFile, err := os.CreateTemp("", "upl-*.tmp") + if err != nil { + http.Error(w, "Server disk error", http.StatusInternalServerError) + return + } + + // Stream from user to local disk + if _, err := io.Copy(tmpFile, part); err != nil { + os.Remove(tmpFile.Name()) // Clean up on fail + http.Error(w, "Failed to read upload", http.StatusInternalServerError) + return + } + + // Get exact file size and rewind the file reader to the beginning + fileStat, _ := tmpFile.Stat() + tmpFile.Seek(0, io.SeekStart) + + // ========================================== + // 2. BUILD THE MULTIPART HEADERS IN MEMORY + // ========================================== + headerBuf := &bytes.Buffer{} + writer := multipart.NewWriter(headerBuf) + writer.WriteField("path", config.MainServerSubPath) + // Create the file boundary header (but don't write the file data to it) + _, err = writer.CreateFormFile(onlyName, newFileName) + if err != nil { + os.Remove(tmpFile.Name()) + http.Error(w, "Failed to create form format", http.StatusInternalServerError) + return + } + + // Manually construct the footer boundary + footerStr := fmt.Sprintf("\r\n--%s--\r\n", writer.Boundary()) + footerReader := strings.NewReader(footerStr) + + // Calculate the EXACT final Content-Length + totalSize := int64(headerBuf.Len()) + fileStat.Size() + int64(len(footerStr)) + + // ========================================== + // 3. COMBINE EVERYTHING INTO A SINGLE STREAM + // ========================================== + // This chains the Headers -> File Data (from disk) -> Footer into one stream + multiReader := io.MultiReader(headerBuf, tmpFile, footerReader) + + // ========================================== + // 4. FIRE THE REQUEST TO MAIN SERVER + // ========================================== + reqUrl := fmt.Sprintf("%s/%s?appendExt=true", config.MainServerURL, onlyName) + req, err := http.NewRequest("POST", reqUrl, multiReader) + if err != nil { + os.Remove(tmpFile.Name()) + http.Error(w, "Failed to create backend request", http.StatusInternalServerError) + return + } + + // THE MAGIC BULLET: Tell CloudLinux the exact size so it doesn't use Chunked Encoding + req.ContentLength = totalSize + + req.Header.Set("Authorization", "Bearer "+config.MainServerToken) + req.Header.Set("Content-Type", writer.FormDataContentType()) + + client := &http.Client{} + resp, err := client.Do(req) + + // Always clean up the temp file from the disk when the request finishes + tmpFile.Close() + os.Remove(tmpFile.Name()) + + if err != nil { + log.Printf("Failed to connect: %v", err) + http.Error(w, "Main server unreachable", http.StatusBadGateway) + return + } + defer resp.Body.Close() + + if resp.StatusCode != http.StatusOK { + errorBody, _ := io.ReadAll(resp.Body) + log.Printf("❌ MAIN SERVER REJECTED! Code: %d, Body: %s", resp.StatusCode, string(errorBody)) + http.Error(w, "Main server rejected the upload", http.StatusBadGateway) + return + } + + // Success! + finalURL := fmt.Sprintf("%s/%s", config.PublicDomain, newFileName) + w.Header().Set("Content-Type", "application/json") + w.WriteHeader(http.StatusOK) + fmt.Fprintf(w, `{"status": "success", "url": "%s"}`, finalURL) + return + } + } + + http.Error(w, "No file found in request", http.StatusBadRequest) +} + +// startTempFileSweeper runs a background goroutine that cleans up orphaned +// upload files in case the server crashes before a defer os.Remove() executes. +func startTempFileSweeper() { + // Wake up and run the scan every 1 hour + ticker := time.NewTicker(1 * time.Hour) + + go func() { + for range ticker.C { + tempDir := os.TempDir() // Gets the system temp directory (/tmp) + + // Read all files in the temp directory + entries, err := os.ReadDir(tempDir) + if err != nil { + log.Printf("Sweeper error: could not read temp directory: %v", err) + continue + } + + now := time.Now() + deletedCount := 0 + + for _, entry := range entries { + if entry.IsDir() { + continue + } + + name := entry.Name() + // Only target files created by our uploadHandler + if strings.HasPrefix(name, "upl-") && strings.HasSuffix(name, ".tmp") { + info, err := entry.Info() + if err != nil { + continue + } + + // If the file is older than 24 hours, delete it + if now.Sub(info.ModTime()) > 24*time.Hour { + fullPath := filepath.Join(tempDir, name) + if err := os.Remove(fullPath); err == nil { + deletedCount++ + } + } + } + } + + if deletedCount > 0 { + log.Printf("Background Sweeper: Cleaned up %d orphaned temp files.", deletedCount) + } + } + }() +} + +func main() { + env.LoadEnv("file-server.env") + startTempFileSweeper() + config = SeverConfig{ + PublicDomain: env.Env.GetEnv(PUBLIC_DOMAIN), + MainServerURL: env.Env.GetEnv(MAIN_SERVER_URL), + MainServerSubPath: env.Env.GetEnv(MAIN_SERVER_SUB_PATH), + MainServerToken: env.Env.GetEnv(MAIN_SERVER_TOKEN), + CurrentServerToken: env.Env.GetEnv(CURRENT_SERVER_TOKEN), + } + env.ValidateEnv(config) + http.HandleFunc("/upload", uploadHandler) + port := env.GetServerPort(env.PORT_KEY) + fmt.Printf("Upload Gateway running on :%s", port) + log.Fatal(http.ListenAndServe(fmt.Sprintf(":%s", port), nil)) +} diff --git a/servers/http-dump/dump-server/repos/end-point.repo.go b/servers/http-dump/dump-server/repos/end-point.repo.go index 29942ff..d65d6b0 100644 --- a/servers/http-dump/dump-server/repos/end-point.repo.go +++ b/servers/http-dump/dump-server/repos/end-point.repo.go @@ -12,8 +12,8 @@ import ( dump_server_interfaces "github.com/rpsoftech/golang-servers/servers/http-dump/dump-server/interfaces" "github.com/rpsoftech/golang-servers/utility/mongodb" "github.com/rpsoftech/golang-servers/utility/redis" - "go.mongodb.org/mongo-driver/bson" - "go.mongodb.org/mongo-driver/mongo" + "go.mongodb.org/mongo-driver/v2/bson" + "go.mongodb.org/mongo-driver/v2/mongo" ) type EndPointRepoStruct struct { diff --git a/servers/http-dump/dump-server/repos/event.repo.go b/servers/http-dump/dump-server/repos/event.repo.go index 78f83f9..f39cd5b 100644 --- a/servers/http-dump/dump-server/repos/event.repo.go +++ b/servers/http-dump/dump-server/repos/event.repo.go @@ -8,7 +8,7 @@ import ( "github.com/rpsoftech/golang-servers/interfaces" dump_server_events "github.com/rpsoftech/golang-servers/servers/http-dump/dump-server/events" "github.com/rpsoftech/golang-servers/utility/mongodb" - "go.mongodb.org/mongo-driver/mongo" + "go.mongodb.org/mongo-driver/v2/mongo" ) type EventRepoStruct struct { diff --git a/servers/http-dump/message-dump/repo/config.repo.go b/servers/http-dump/message-dump/repo/config.repo.go index a46f454..6addfda 100644 --- a/servers/http-dump/message-dump/repo/config.repo.go +++ b/servers/http-dump/message-dump/repo/config.repo.go @@ -8,8 +8,8 @@ import ( "github.com/rpsoftech/golang-servers/interfaces" messagedump_interfaces "github.com/rpsoftech/golang-servers/servers/http-dump/message-dump/interfaces" "github.com/rpsoftech/golang-servers/utility/mongodb" - "go.mongodb.org/mongo-driver/bson" - "go.mongodb.org/mongo-driver/mongo" + "go.mongodb.org/mongo-driver/v2/bson" + "go.mongodb.org/mongo-driver/v2/mongo" ) type MessageDumpConfigRepoStruct struct { diff --git a/servers/jwelly/main-server/repos/key-value-data.repo.go b/servers/jwelly/main-server/repos/key-value-data.repo.go index 4390706..41527aa 100644 --- a/servers/jwelly/main-server/repos/key-value-data.repo.go +++ b/servers/jwelly/main-server/repos/key-value-data.repo.go @@ -12,8 +12,8 @@ import ( utility_functions "github.com/rpsoftech/golang-servers/utility/functions" "github.com/rpsoftech/golang-servers/utility/mongodb" "github.com/rpsoftech/golang-servers/utility/redis" - "go.mongodb.org/mongo-driver/bson" - "go.mongodb.org/mongo-driver/mongo" + "go.mongodb.org/mongo-driver/v2/bson" + "go.mongodb.org/mongo-driver/v2/mongo" ) type KeyValueDataRepoStruct struct { diff --git a/servers/jwelly/mysql-backup-cmd/main.go b/servers/jwelly/mysql-backup-cmd/main.go index 45a5c6e..8c01337 100644 --- a/servers/jwelly/mysql-backup-cmd/main.go +++ b/servers/jwelly/mysql-backup-cmd/main.go @@ -74,12 +74,12 @@ func DoBackupAndUpload(c *interfaces.ConfigWithConnection) { gzipWriter.Write([]byte("SET foreign_key_checks = 0;\n")) var err error cmdArray := []string{"mysqldump", - "-h", c.ServerConfig.MysqlConfig.MYSQL_HOST} + "-h ", c.ServerConfig.MysqlConfig.MYSQL_HOST} if c.ServerConfig.MysqlConfig.MYSQL_PORT != 3306 { cmdArray = append(cmdArray, fmt.Sprintf("--port=%d", c.ServerConfig.MysqlConfig.MYSQL_PORT)) } if c.ServerConfig.MysqlConfig.MYSQL_USERNAME != "" { - cmdArray = append(cmdArray, "-u", c.ServerConfig.MysqlConfig.MYSQL_USERNAME) + cmdArray = append(cmdArray, "-u ", c.ServerConfig.MysqlConfig.MYSQL_USERNAME) } if c.ServerConfig.MysqlConfig.MYSQL_PASSWORD != "" { cmdArray = append(cmdArray, "-p"+c.ServerConfig.MysqlConfig.MYSQL_PASSWORD) diff --git a/servers/soham/whatsapp-client/apis/index.go b/servers/soham/whatsapp-client/apis/index.go index d1743e7..3171855 100644 --- a/servers/soham/whatsapp-client/apis/index.go +++ b/servers/soham/whatsapp-client/apis/index.go @@ -6,4 +6,5 @@ import ( func AddApis(app fiber.Router) { app.Get("/qr_code", GetQrCode) + app.Get("/status", LoginStatus) } diff --git a/servers/soham/whatsapp-client/apis/login-status.go b/servers/soham/whatsapp-client/apis/login-status.go new file mode 100644 index 0000000..ab09c14 --- /dev/null +++ b/servers/soham/whatsapp-client/apis/login-status.go @@ -0,0 +1,31 @@ +package soham_whatsapp_client_apis + +import ( + "fmt" + "net/http" + + "github.com/gofiber/fiber/v2" + whatsapp_functions "github.com/rpsoftech/golang-servers/functions/whatsapp" + whatsapp_core "github.com/rpsoftech/golang-servers/functions/whatsapp/core" + "github.com/rpsoftech/golang-servers/interfaces" +) + +func LoginStatus(c *fiber.Ctx) error { + number, err := whatsapp_functions.ExtractNumberFromCtx(c) + if err != nil { + return err + } + + connection, ok := whatsapp_core.ConnectionMap[number] + if !ok || connection == nil { + return &interfaces.RequestError{ + StatusCode: http.StatusNotFound, + Code: interfaces.ERROR_CONNECTION_NOT_FOUND, + Message: fmt.Sprintf("Number %s Not Found", number), + Name: "ERROR_CONNECTION_NOT_FOUND", + } + } + return c.JSON(fiber.Map{ + "status": connection.ConnectionStatus, + }) +} diff --git a/servers/soham/whatsapp-client/main.go b/servers/soham/whatsapp-client/main.go index 74df2ea..885602e 100644 --- a/servers/soham/whatsapp-client/main.go +++ b/servers/soham/whatsapp-client/main.go @@ -35,6 +35,7 @@ func main() { if _, err := utility_functions.Exist(outputLogFolderDir); errors.Is(err, os.ErrNotExist) { os.MkdirAll(outputLogFolderDir, 0777) } + // store.DeviceProps.Os = proto.String("BOSS") whatsapp_core.OutPutFilePath = ReturnOutPutFilePath(env.FindAndReturnCurrentDir()) container := whatsapp_core.InitSqlContainer() if whatsapp_config.Env.AUTO_CONNECT_TO_WHATSAPP { diff --git a/servers/soham/whatsapp-server/env/index.go b/servers/soham/whatsapp-server/env/index.go index 2d52fa6..f2b3ebb 100644 --- a/servers/soham/whatsapp-server/env/index.go +++ b/servers/soham/whatsapp-server/env/index.go @@ -2,6 +2,7 @@ package soham_whatsapp_server_env import ( "github.com/gofiber/contrib/v3/websocket" + "github.com/gofiber/fiber/v3/log" "github.com/google/uuid" "github.com/rpsoftech/golang-servers/env" soham_common_req_keys "github.com/rpsoftech/golang-servers/servers/soham/common" @@ -30,7 +31,7 @@ var ( func init() { env.LoadEnv("whatsapp-server.env") - println("WhatsApp ServerEnv Initialized") + log.Debug("WhatsApp ServerEnv Initialized") Env = &whatsappEnv{ DefaultEnv: env.Env, BASE_UUID: env.Env.GetEnv("BASE_UUID"), diff --git a/servers/soham/whatsapp-server/main.go b/servers/soham/whatsapp-server/main.go index 4d2e0cf..a8939e8 100644 --- a/servers/soham/whatsapp-server/main.go +++ b/servers/soham/whatsapp-server/main.go @@ -5,15 +5,16 @@ import ( "crypto/x509" "encoding/json" "fmt" - "log" "os" "path/filepath" "github.com/gofiber/contrib/v3/websocket" "github.com/gofiber/fiber/v3" + "github.com/gofiber/fiber/v3/log" "github.com/gofiber/fiber/v3/middleware/logger" "github.com/rpsoftech/golang-servers/env" "github.com/rpsoftech/golang-servers/interfaces" + soham_common_req_keys "github.com/rpsoftech/golang-servers/servers/soham/common" soham_whatsapp_server_api "github.com/rpsoftech/golang-servers/servers/soham/whatsapp-server/api" soham_whatsapp_server_env "github.com/rpsoftech/golang-servers/servers/soham/whatsapp-server/env" soham_whatsapp_server_middleware "github.com/rpsoftech/golang-servers/servers/soham/whatsapp-server/middleware" @@ -38,12 +39,26 @@ func main() { Code: interfaces.ERROR_INTERNAL_SERVER, Message: "Some Internal Error", Name: "Global Error Handler Function", + Extra: err, }) } return c.Status(mappedError.StatusCode).JSON(mappedError) }, }) - app.Use(logger.New()) + app.Use(logger.New( + logger.Config{ + Format: "${time} | ${status} | ${latency} | ${number} | ${ip} | ${path} | ${error}\n", + CustomTags: map[string]logger.LogFunc{ + "number": func(output logger.Buffer, c fiber.Ctx, data *logger.Data, extraParam string) (int, error) { + val := c.Locals(soham_common_req_keys.WHATSAPP_CLIENT_NUM_KEY) + if val == nil { + return output.WriteString("N/A") + } + return fmt.Fprintf(output, "%v", val) + }, + }, + }, + )) app.Use("/whatsapp-client", soham_whatsapp_server_middleware.ValidateWhatsAppClientToken) app.Get("/whatsapp-client/ws", websocket.New(soham_whatsapp_server_websocket.WhatsappClientWebsocketHandler)) soham_whatsapp_server_api.AddApis(app.Group("/api")) @@ -71,22 +86,22 @@ func main() { panic(fmt.Errorf("SSL_CONFIG_ERROR %#v", errs)) } if _, err := os.Stat(sslConfig.CertFilePath); os.IsNotExist(err) { - log.Printf("SSL Cert File Not Exist at %s", sslConfig.CertFilePath) + log.Errorf("SSL Cert File Not Exist at %s", sslConfig.CertFilePath) return } if _, err := os.Stat(sslConfig.KeyFilePath); os.IsNotExist(err) { - log.Printf("SSL Key File Not Exist at %s", sslConfig.KeyFilePath) + log.Errorf("SSL Key File Not Exist at %s", sslConfig.KeyFilePath) return } certificate, err := tls.LoadX509KeyPair(sslConfig.CertFilePath, sslConfig.KeyFilePath) if err != nil { - log.Printf("Error Loading SSL Certificate, Error: %v", err) + log.Errorf("Error Loading SSL Certificate, Error: %v", err) return } caCertPool := x509.NewCertPool() caCert, err := os.ReadFile("/Users/keyurshah/Projects/GolangServers/ssl/fullchain.crt") if err != nil { - log.Printf("Error Reading CA Certificate File, Error: %v", err) + log.Errorf("Error Reading CA Certificate File, Error: %v", err) return } caCertPool.AppendCertsFromPEM(caCert) @@ -98,7 +113,7 @@ func main() { // tlsConfig.TLSConfig.Certificates = // key := sslConfig.KeyFilePath } else { - log.Printf("SSL File Path Not Exist at %s", sslPath) + log.Infof("SSL File Path Not Exist at %s", sslPath) } app.Listen(hostAndPort, tlsConfig) } diff --git a/servers/soham/whatsapp-server/services/access-refresh-token.service.go b/servers/soham/whatsapp-server/services/access-refresh-token.service.go index 347207b..3b50eb3 100644 --- a/servers/soham/whatsapp-server/services/access-refresh-token.service.go +++ b/servers/soham/whatsapp-server/services/access-refresh-token.service.go @@ -1,6 +1,7 @@ package soham_whatsapp_server_services import ( + "github.com/gofiber/fiber/v3/log" jwtv5 "github.com/golang-jwt/jwt/v5" "github.com/rpsoftech/golang-servers/interfaces" soham_common_req_keys "github.com/rpsoftech/golang-servers/servers/soham/common" @@ -17,7 +18,7 @@ func GetAccessTokenService() *jwt.TokenService { SigningKey: []byte(soham_whatsapp_server_env.Env.ACCESS_TOKEN_KEY), Parser: jwtv5.NewParser(jwtv5.WithValidMethods([]string{"HS256"})), } - println("Token Service Initialized") + log.Info("Token Service Initialized") } return AccessTokenService } diff --git a/servers/soham/whatsapp-server/services/whatsapp.serivce.go b/servers/soham/whatsapp-server/services/whatsapp.serivce.go index dc5f516..bacafdb 100644 --- a/servers/soham/whatsapp-server/services/whatsapp.serivce.go +++ b/servers/soham/whatsapp-server/services/whatsapp.serivce.go @@ -1,9 +1,9 @@ package soham_whatsapp_server_services import ( - "log" "net/http" + "github.com/gofiber/fiber/v3/log" "github.com/rpsoftech/golang-servers/interfaces" soham_common_req_keys "github.com/rpsoftech/golang-servers/servers/soham/common" soham_whatsapp_server_env "github.com/rpsoftech/golang-servers/servers/soham/whatsapp-server/env" @@ -22,7 +22,7 @@ func InialiseWhatsappService(reqIdMap *map[string]chan any, websocketConnectionM ReqIdMap: reqIdMap, WebsocketConnectionMap: websocketConnectionMap, } - log.Println("Whatsapp Service Intialised") + log.Info("Whatsapp Service Intialised") return WhatsappService } diff --git a/servers/soham/whatsapp-server/websocket/index.go b/servers/soham/whatsapp-server/websocket/index.go index 48cd178..f5a4673 100644 --- a/servers/soham/whatsapp-server/websocket/index.go +++ b/servers/soham/whatsapp-server/websocket/index.go @@ -2,10 +2,10 @@ package soham_whatsapp_server_websocket import ( "encoding/json" - "log" "strconv" "github.com/gofiber/contrib/v3/websocket" + "github.com/gofiber/fiber/v3/log" soham_common_req_keys "github.com/rpsoftech/golang-servers/servers/soham/common" soham_whatsapp_server_env "github.com/rpsoftech/golang-servers/servers/soham/whatsapp-server/env" ) @@ -13,21 +13,21 @@ import ( func WhatsappClientWebsocketHandler(c *websocket.Conn) { numberTokenString, ok := c.Locals(soham_common_req_keys.WHATSAPP_CLIENT_NUM_KEY).(string) if !ok { - log.Println("Missing Number Token in WebSocket connection") + log.Debug("Missing Number Token in WebSocket connection") c.Close() return } uuidToken, ok := c.Locals(soham_common_req_keys.WHATSAPP_CLIENT_TOKEN_KEY).(string) if !ok { - log.Println("Missing UUID Token in WebSocket connection") + log.Debug("Missing UUID Token in WebSocket connection") c.Close() return } - println("Websocket Connection Established with Number Token:", uuidToken) - log.Printf("Connected ======> %s\n", numberTokenString) + log.Debug("Websocket Connection Established with Number Token:", uuidToken) + log.Debugf("Connected ======> %s\n", numberTokenString) numberToken, err := strconv.Atoi(numberTokenString) if err != nil { - log.Println("Error converting number token to integer:", err) + log.Error("Error converting number token to integer:", err) c.Close() return } @@ -38,8 +38,8 @@ func WhatsappClientWebsocketHandler(c *websocket.Conn) { soham_whatsapp_server_env.WebsocketConnectionMap[numberToken] = connection soham_whatsapp_server_env.ConnectionNumberStatusMap[numberToken] = soham_common_req_keys.NOT_LOGGED_IN - log.Printf("Subscribed ======> %d\n", numberToken) - log.Printf("ConnectionStatus ======> %s\n", soham_common_req_keys.NOT_LOGGED_IN) + log.Debugf("Subscribed ======> %d\n", numberToken) + log.Debugf("ConnectionStatus ======> %s\n", soham_common_req_keys.NOT_LOGGED_IN) for { _, msg, err := c.ReadMessage() if err != nil { @@ -48,20 +48,23 @@ func WhatsappClientWebsocketHandler(c *websocket.Conn) { var whatsappClientMessage soham_common_req_keys.WhatsappClientMessage err = json.Unmarshal(msg, &whatsappClientMessage) if err != nil { - log.Println("Error unmarshalling message:", err) + log.Errorf("Error unmarshalling message:", err) continue } if whatsappClientMessage.Type == soham_common_req_keys.STATUS_MESSAGE { statusString, ok := whatsappClientMessage.Message.(string) if !ok { - log.Printf("Invalid status message format: %+v\n", whatsappClientMessage) + log.Errorf("Invalid status message format: %+v\n", whatsappClientMessage) continue } status, ok := soham_common_req_keys.StringToEnumConnectionStatus(statusString) if ok { // fmt.Printf("ConnectionStatus ======> %s\n", status) - if status == soham_common_req_keys.LOGGED_IN { - log.Printf("Loggedin =====> %d", numberToken) + switch status { + case soham_common_req_keys.LOGGED_IN: + log.Debugf("Loggedin =====> %d", numberToken) + case soham_common_req_keys.NOT_LOGGED_IN: + log.Debugf("Not Logged in =====> %d", numberToken) } soham_whatsapp_server_env.ConnectionNumberStatusMap[numberToken] = status } @@ -69,14 +72,14 @@ func WhatsappClientWebsocketHandler(c *websocket.Conn) { if ch, ok := soham_whatsapp_server_env.ReqestIdMap[whatsappClientMessage.ReqId]; ok { ch <- whatsappClientMessage.Message } else { - log.Printf("Request ID not found: %+v", whatsappClientMessage) + log.Debugf("Request ID not found: %+v", whatsappClientMessage) } } else { - log.Printf("Unmarshalled Message: %+v", whatsappClientMessage) + log.Debugf("Unmarshalled Message: %+v", whatsappClientMessage) } } delete(soham_whatsapp_server_env.WebsocketConnectionMap, numberToken) delete(soham_whatsapp_server_env.ConnectionNumberStatusMap, numberToken) - log.Println("Websocket Connection Closed for Number Token:", numberToken) - log.Printf("Unsubscribed =====> %d", numberToken) + log.Debug("Websocket Connection Closed for Number Token:", numberToken) + log.Debugf("Unsubscribed =====> %d", numberToken) } diff --git a/servers/tunnel-client/configs.json b/servers/tunnel-client/configs.json new file mode 100644 index 0000000..0c6852d --- /dev/null +++ b/servers/tunnel-client/configs.json @@ -0,0 +1,14 @@ +{ + "serverIp": "103.174.103.159", + "serverPort": 8080, + "remoteTunnelConfig": [ + { + "localPort": 4000, + "remotePort": 20039 + }, + { + "localPort": 4001, + "remotePort": 20038 + } + ] +} diff --git a/servers/tunnel-client/debug.log b/servers/tunnel-client/debug.log new file mode 100644 index 0000000..593b815 --- /dev/null +++ b/servers/tunnel-client/debug.log @@ -0,0 +1,4 @@ +2026/04/28 15:00:39 Chisel Started...! +2026/04/28 15:01:11 Chisel Started...! +2026/04/28 15:07:49 Chisel Started...! +2026/04/28 15:19:09 Chisel Started...! diff --git a/servers/tunnel-client/main.go b/servers/tunnel-client/main.go new file mode 100644 index 0000000..9e11c92 --- /dev/null +++ b/servers/tunnel-client/main.go @@ -0,0 +1,132 @@ +package main + +import ( + "context" + "encoding/json" + "errors" + "fmt" + "log" + "os" + "path/filepath" + "slices" + "time" + + chclient "github.com/jpillora/chisel/client" + chshare "github.com/jpillora/chisel/share" + "github.com/jpillora/chisel/share/cos" + "github.com/rpsoftech/golang-servers/validator" +) + +type ( + tunnelService struct{} + Config struct { + ServerIp string `json:"serverIp" validate:"required"` + ServerPort int `json:"serverPort" validate:"required,port"` + RemoteTunnelConfig []TunnelConfig `json:"remoteTunnelConfig" validate:"required,min=1"` + } + TunnelConfig struct { + LocalPort int `json:"localPort" validate:"required,port"` + RemotePort int `json:"remotePort" validate:"required,port"` + } +) + +var ( + Client *chclient.Client + ChiselContext context.Context + ShouldBeRunning = false +) + +func main() { + f, err := os.OpenFile(filepath.Join(FindAndReturnCurrentDir(), "debug.log"), os.O_RDWR|os.O_CREATE|os.O_APPEND, 0666) + if err != nil { + log.Fatalln(fmt.Errorf("error opening file: %v", err)) + } + defer f.Close() + + log.SetOutput(f) + start() + log.Print("Finished Function") +} + +func start() { + fmt.Println(len(os.Args), os.Args) + currentDir := FindAndReturnCurrentDir() + configFilePAth := filepath.Join(currentDir, "configs.json") + ThisConfig := &Config{} + + fmt.Printf("Config path %s\n", configFilePAth) + if _, err := os.Stat(configFilePAth); errors.Is(err, os.ErrNotExist) { + panic(fmt.Errorf("Config Not Exist on Path %s", configFilePAth)) + } + dat, err := os.ReadFile(configFilePAth) + Check(err) + json.Unmarshal(dat, ThisConfig) + + if errs := validator.Validator.Validate(ThisConfig); len(errs) > 0 { + panic(fmt.Errorf("Config Error %#v", errs)) + } + + remote := make([]string, len(ThisConfig.RemoteTunnelConfig)) + for i, r := range ThisConfig.RemoteTunnelConfig { + remote[i] = fmt.Sprintf("R:%d:%d", r.RemotePort, r.LocalPort) + } + chshare.BuildVersion = "1.9.1" + client, err := chclient.NewClient(&chclient.Config{ + Remotes: remote, + MaxRetryCount: 100, + MaxRetryInterval: 60 * time.Minute, + Server: fmt.Sprintf("%s:%d", ThisConfig.ServerIp, ThisConfig.ServerPort), + }) + if err != nil { + log.Print(err.Error()) + } + Client = client + ChiselContext = cos.InterruptContext() + StartChisel() +} + +func StartChisel() { + ShouldBeRunning = true + runningChisel() +} + +func runningChisel() { + time.Sleep(3 * time.Second) + if ShouldBeRunning { + log.Print("Chisel Started...!") + Client.Start(ChiselContext) + Client.Wait() + log.Print("Chisel Stopped...!") + runningChisel() + } +} + +func StopChisel() { + ShouldBeRunning = false + Client.Close() + log.Print("Chisel Stopped...!") +} + +func IsDebug() bool { + return slices.Contains(os.Args, "--dev") +} + +func FindAndReturnCurrentDir() string { + currentDir := "" + if IsDebug() { + current, err := os.Getwd() + Check(err) + currentDir = current + } else { + exePath, err := os.Executable() + currentDir = filepath.Dir(exePath) + Check(err) + } + return currentDir +} + +func Check(e error) { + if e != nil { + panic(e) + } +} diff --git a/servers/whatsapp-server/main.go b/servers/whatsapp-server/main.go index 0ec1636..fc54c58 100644 --- a/servers/whatsapp-server/main.go +++ b/servers/whatsapp-server/main.go @@ -7,14 +7,14 @@ import ( "path/filepath" "time" - "github.com/gofiber/fiber/v2" - "github.com/gofiber/fiber/v2/middleware/logger" + "github.com/gofiber/fiber/v3" + "github.com/gofiber/fiber/v3/middleware/logger" "github.com/rpsoftech/golang-servers/env" whatsapp_config "github.com/rpsoftech/golang-servers/functions/whatsapp/config" + whatsapp_core "github.com/rpsoftech/golang-servers/functions/whatsapp/core" "github.com/rpsoftech/golang-servers/interfaces" whatsapp_server_apis "github.com/rpsoftech/golang-servers/servers/whatsapp-server/src/apis" whatsapp_server_middleware "github.com/rpsoftech/golang-servers/servers/whatsapp-server/src/middleware" - "github.com/rpsoftech/golang-servers/servers/whatsapp-server/src/whatsapp" utility_functions "github.com/rpsoftech/golang-servers/utility/functions" ) @@ -35,13 +35,13 @@ func main() { if _, err := utility_functions.Exist(outputLogFolderDir); errors.Is(err, os.ErrNotExist) { os.MkdirAll(outputLogFolderDir, 0777) } - whatsapp.OutPutFilePath = ReturnOutPutFilePath(env.FindAndReturnCurrentDir()) - whatsapp.InitSqlContainer() + whatsapp_core.OutPutFilePath = ReturnOutPutFilePath(env.FindAndReturnCurrentDir()) + container := whatsapp_core.InitSqlContainer() if whatsapp_config.Env.AUTO_CONNECT_TO_WHATSAPP { go func() { for k := range whatsapp_config.WhatsappNumberConfigMap.Tokens { jidString := whatsapp_config.WhatsappNumberConfigMap.JID[k] - whatsapp.ConnectToNumber(jidString, k) + whatsapp_core.ConnectToNumber(jidString, k, container) } }() } @@ -52,7 +52,7 @@ func main() { func InitFiberServer() { app := fiber.New(fiber.Config{ BodyLimit: 200 * 1024 * 1024, - ErrorHandler: func(c *fiber.Ctx, err error) error { + ErrorHandler: func(c fiber.Ctx, err error) error { mappedError, ok := err.(*interfaces.RequestError) if !ok { println(err.Error()) @@ -66,11 +66,10 @@ func InitFiberServer() { }, }) app.Use(logger.New()) - app.Static("/swagger", "./swagger") whatsapp_server_apis.AddApis(app.Group("/v1", whatsapp_server_middleware.TokenDecrypter, whatsapp_server_middleware.AllowOnlyValidTokenMiddleWare)) app.Get("/scan/:id", whatsapp_server_apis.OpenBrowserWithQr) - app.Use(func(c *fiber.Ctx) error { + app.Use(func(c fiber.Ctx) error { return c.Status(fiber.StatusNotFound).SendString("Sorry can't find that!") }) hostAndPort := "" diff --git a/servers/whatsapp-server/src/apis/append.token.go b/servers/whatsapp-server/src/apis/append.token.go index 856ae30..03edac8 100644 --- a/servers/whatsapp-server/src/apis/append.token.go +++ b/servers/whatsapp-server/src/apis/append.token.go @@ -1,11 +1,11 @@ package whatsapp_server_apis import ( - "github.com/gofiber/fiber/v2" + "github.com/gofiber/fiber/v3" whatsapp_config "github.com/rpsoftech/golang-servers/functions/whatsapp/config" ) -func AppendTokenInConfigJSON(c *fiber.Ctx) error { +func AppendTokenInConfigJSON(c fiber.Ctx) error { token := c.Query("token") if token == "" { return c.JSON(fiber.Map{ diff --git a/servers/whatsapp-server/src/apis/index.go b/servers/whatsapp-server/src/apis/index.go index ecf7744..61eb149 100644 --- a/servers/whatsapp-server/src/apis/index.go +++ b/servers/whatsapp-server/src/apis/index.go @@ -7,11 +7,11 @@ import ( "net/http" "strconv" - "github.com/gofiber/fiber/v2" + "github.com/gofiber/fiber/v3" + whatsapp_core "github.com/rpsoftech/golang-servers/functions/whatsapp/core" "github.com/rpsoftech/golang-servers/interfaces" whatsapp_functions "github.com/rpsoftech/golang-servers/servers/whatsapp-server/src/functions" whatsapp_server_middleware "github.com/rpsoftech/golang-servers/servers/whatsapp-server/src/middleware" - "github.com/rpsoftech/golang-servers/servers/whatsapp-server/src/whatsapp" utility_functions "github.com/rpsoftech/golang-servers/utility/functions" "github.com/skip2/go-qrcode" ) @@ -40,9 +40,9 @@ func AddApis(app fiber.Router) { } } -func SendMediaFile(c *fiber.Ctx) error { +func SendMediaFile(c fiber.Ctx) error { body := new(apiSendMessage) - c.BodyParser(body) + c.Bind().Body(body) number, err := whatsapp_functions.ExtractNumberFromCtx(c) if err != nil { return err @@ -71,7 +71,7 @@ func SendMediaFile(c *fiber.Ctx) error { Name: "ERROR_INVALID_INPUT", } } - connection, ok := whatsapp.ConnectionMap[number] + connection, ok := whatsapp_core.ConnectionMap[number] if !ok || connection == nil { return &interfaces.RequestError{ StatusCode: http.StatusNotFound, @@ -108,9 +108,9 @@ func SendMediaFile(c *fiber.Ctx) error { return c.JSON(connection.SendMediaFileWithPath(body.To, destination, file.Filename, body.Msg)) } } -func SendMediaFileWithBase64(c *fiber.Ctx) error { +func SendMediaFileWithBase64(c fiber.Ctx) error { body := new(apiSendMediaMsgWithBase64) - c.BodyParser(body) + c.Bind().Body(body) if err := utility_functions.ValidateReqInput(body); err != nil { return err @@ -129,7 +129,7 @@ func SendMediaFileWithBase64(c *fiber.Ctx) error { return err } - connection, ok := whatsapp.ConnectionMap[number] + connection, ok := whatsapp_core.ConnectionMap[number] if !ok || connection == nil { return &interfaces.RequestError{ StatusCode: http.StatusNotFound, @@ -155,9 +155,9 @@ func SendMediaFileWithBase64(c *fiber.Ctx) error { return c.JSON(connection.SendMediaFileBase64(body.To, body.Base64, body.FileName, body.Msg)) } } -func SendMessage(c *fiber.Ctx) error { +func SendMessage(c fiber.Ctx) error { body := new(apiSendMessage) - c.BodyParser(body) + c.Bind().Body(body) if err := utility_functions.ValidateReqInput(body); err != nil { return err @@ -182,7 +182,7 @@ func SendMessage(c *fiber.Ctx) error { Name: "ERROR_INVALID_INPUT", } } - connection, ok := whatsapp.ConnectionMap[token] + connection, ok := whatsapp_core.ConnectionMap[token] if !ok || connection == nil { return &interfaces.RequestError{ StatusCode: http.StatusNotFound, @@ -221,13 +221,13 @@ func SendMessage(c *fiber.Ctx) error { // @Failure 404 {object} interfaces.RequestError // @Failure 500 {object} interfaces.RequestError // @Router /connections/{number}/qrcode [get] -func GetQrCode(c *fiber.Ctx) error { +func GetQrCode(c fiber.Ctx) error { number, err := whatsapp_functions.ExtractNumberFromCtx(c) if err != nil { return err } - connection, ok := whatsapp.ConnectionMap[number] + connection, ok := whatsapp_core.ConnectionMap[number] if !ok || connection == nil { return &interfaces.RequestError{ StatusCode: http.StatusNotFound, diff --git a/servers/whatsapp-server/src/apis/qr-browser.api.go b/servers/whatsapp-server/src/apis/qr-browser.api.go index cbd96d1..947df26 100644 --- a/servers/whatsapp-server/src/apis/qr-browser.api.go +++ b/servers/whatsapp-server/src/apis/qr-browser.api.go @@ -3,7 +3,7 @@ package whatsapp_server_apis import ( "fmt" - "github.com/gofiber/fiber/v2" + "github.com/gofiber/fiber/v3" ) const index = ` @@ -57,8 +57,8 @@ const index = ` ` -func OpenBrowserWithQr(c *fiber.Ctx) error { - id := c.Params("id") +func OpenBrowserWithQr(c fiber.Ctx) error { + id := c.Get("id") // println(c.Hostname()) c.Set("Content-Type", "text/html; charset=utf-8") return c.Send([]byte(fmt.Sprintf(index, id))) diff --git a/servers/whatsapp-server/src/apis/start.number.go b/servers/whatsapp-server/src/apis/start.number.go index 7194a52..2efec01 100644 --- a/servers/whatsapp-server/src/apis/start.number.go +++ b/servers/whatsapp-server/src/apis/start.number.go @@ -3,18 +3,18 @@ package whatsapp_server_apis import ( "fmt" - "github.com/gofiber/fiber/v2" + "github.com/gofiber/fiber/v3" whatsapp_config "github.com/rpsoftech/golang-servers/functions/whatsapp/config" + whatsapp_core "github.com/rpsoftech/golang-servers/functions/whatsapp/core" whatsapp_functions "github.com/rpsoftech/golang-servers/servers/whatsapp-server/src/functions" - "github.com/rpsoftech/golang-servers/servers/whatsapp-server/src/whatsapp" ) -func StartNumber(c *fiber.Ctx) error { +func StartNumber(c fiber.Ctx) error { token, err := whatsapp_functions.ExtractNumberFromCtx(c) if err != nil { return err } - _, ok := whatsapp.ConnectionMap[token] + _, ok := whatsapp_core.ConnectionMap[token] if ok { return c.JSON(fiber.Map{ "success": false, @@ -22,7 +22,7 @@ func StartNumber(c *fiber.Ctx) error { }) } jidString := whatsapp_config.WhatsappNumberConfigMap.JID[token] - whatsapp.ConnectToNumber(jidString, token) + whatsapp_core.ConnectToNumber(jidString, token, whatsapp_core.InitSqlContainer()) return c.JSON(fiber.Map{ "success": true, }) diff --git a/servers/whatsapp-server/src/functions/common-req.functions.go b/servers/whatsapp-server/src/functions/common-req.functions.go index b403e40..29c2b40 100644 --- a/servers/whatsapp-server/src/functions/common-req.functions.go +++ b/servers/whatsapp-server/src/functions/common-req.functions.go @@ -3,12 +3,12 @@ package whatsapp_functions import ( "net/http" - "github.com/gofiber/fiber/v2" + "github.com/gofiber/fiber/v3" "github.com/rpsoftech/golang-servers/interfaces" whatsapp_interfaces "github.com/rpsoftech/golang-servers/interfaces/whatsapp" ) -func ExtractKeyFromHeader(c *fiber.Ctx, key string) string { +func ExtractKeyFromHeader(c fiber.Ctx, key string) string { reqHeaders := c.GetReqHeaders() if tokenString, foundToken := reqHeaders[key]; !foundToken || len(tokenString) != 1 || tokenString[0] == "" { return "" @@ -16,7 +16,7 @@ func ExtractKeyFromHeader(c *fiber.Ctx, key string) string { return tokenString[0] } } -func ExtractNumberFromCtx(c *fiber.Ctx) (string, error) { +func ExtractNumberFromCtx(c fiber.Ctx) (string, error) { id, ok := c.Locals(whatsapp_interfaces.REQ_LOCAL_NUMBER_KEY).(string) if !ok { return "", &interfaces.RequestError{ diff --git a/servers/whatsapp-server/src/middleware/token-validator.go b/servers/whatsapp-server/src/middleware/token-validator.go index d645232..6d46b8f 100644 --- a/servers/whatsapp-server/src/middleware/token-validator.go +++ b/servers/whatsapp-server/src/middleware/token-validator.go @@ -1,7 +1,7 @@ package whatsapp_server_middleware import ( - "github.com/gofiber/fiber/v2" + "github.com/gofiber/fiber/v3" "github.com/rpsoftech/golang-servers/env" whatsapp_config "github.com/rpsoftech/golang-servers/functions/whatsapp/config" "github.com/rpsoftech/golang-servers/interfaces" @@ -9,7 +9,7 @@ import ( ) // fiber middleware for jwt -func TokenDecrypter(c *fiber.Ctx) error { +func TokenDecrypter(c fiber.Ctx) error { reqHeaders := c.GetReqHeaders() tokenString, foundToken := reqHeaders[env.RequestTokenHeaderKey] if !foundToken || len(tokenString) != 1 || tokenString[0] == "" { @@ -39,7 +39,7 @@ func TokenDecrypter(c *fiber.Ctx) error { return c.Next() } -func AllowOnlyValidTokenMiddleWare(c *fiber.Ctx) error { +func AllowOnlyValidTokenMiddleWare(c fiber.Ctx) error { jwtRawFromLocal := c.Locals(whatsapp_interfaces.REQ_LOCAL_NUMBER_KEY) localError := c.Locals(interfaces.REQ_LOCAL_ERROR_KEY) @@ -66,7 +66,7 @@ func AllowOnlyValidTokenMiddleWare(c *fiber.Ctx) error { return c.Next() } -func AllowOnlyValidLoggedInWhatsapp(c *fiber.Ctx) error { +func AllowOnlyValidLoggedInWhatsapp(c fiber.Ctx) error { jwtRawFromLocal := c.Locals(whatsapp_interfaces.REQ_LOCAL_NUMBER_KEY) token, ok := jwtRawFromLocal.(string) if !ok { diff --git a/servers/whatsapp-server/src/whatsapp/index.go b/servers/whatsapp-server/src/whatsapp/index.go deleted file mode 100644 index 639d4fc..0000000 --- a/servers/whatsapp-server/src/whatsapp/index.go +++ /dev/null @@ -1,67 +0,0 @@ -package whatsapp - -import ( - "context" - "fmt" - "path/filepath" - - _ "github.com/mattn/go-sqlite3" - "github.com/rpsoftech/golang-servers/env" - - "go.mau.fi/whatsmeow" - "go.mau.fi/whatsmeow/store" - "go.mau.fi/whatsmeow/store/sqlstore" - "go.mau.fi/whatsmeow/types" - waLog "go.mau.fi/whatsmeow/util/log" -) - -var SqlContainer *sqlstore.Container -var ctx = context.Background() - -func InitSqlContainer() *sqlstore.Container { - if SqlContainer == nil { - - dbLog := waLog.Stdout("Database", "WARN", true) - // Make sure you add appropriate DB connector imports, e.g. github.com/mattn/go-sqlite3 for SQLite - var err error - SqlContainer, err = sqlstore.New(ctx, "sqlite3", fmt.Sprintf("file:%s?_foreign_keys=on", filepath.Join(env.FindAndReturnCurrentDir(), "WhatsappSuperSecrete.db")), dbLog) - if err != nil { - panic(err) - } - } - return SqlContainer -} - -func ConnectToNumber(jidString string, token string) { - // SqlContainer.PutDevice() - if deviceStores, _ := SqlContainer.GetAllDevices(ctx); true { - for _, deviceStore := range deviceStores { - println(deviceStore.ID.User) - } - } - var JID types.JID - if jidString != "" { - JID, _ = types.ParseJID(jidString) - } - var deviceStore *store.Device - if !JID.IsEmpty() { - var err error - deviceStore, err = SqlContainer.GetDevice(ctx, JID) - if err != nil { - println(err.Error()) - } - } - if deviceStore == nil { - deviceStore = SqlContainer.NewDevice() - // deviceStore = types.DEv(number, types.DefaultUserServer) - } - clientLog := waLog.Stdout("Client", "ERROR", true) - client := whatsmeow.NewClient(deviceStore, clientLog) - client.EnableAutoReconnect = true - println(client.LastSuccessfulConnect.String()) - connection := &WhatsappConnection{Client: client, ConnectionStatus: 0, SyncFinished: false, Token: token} - ConnectionMap[token] = connection - client.AddEventHandler(connection.eventHandler) - - connection.ConnectAndGetQRCode() -} diff --git a/servers/whatsapp-server/src/whatsapp/interfaces.go b/servers/whatsapp-server/src/whatsapp/interfaces.go deleted file mode 100644 index eecb33c..0000000 --- a/servers/whatsapp-server/src/whatsapp/interfaces.go +++ /dev/null @@ -1,339 +0,0 @@ -package whatsapp - -import ( - "context" - "encoding/base64" - "fmt" - "net/http" - "os" - "reflect" - "strings" - - "github.com/mdp/qrterminal/v3" - "github.com/rpsoftech/golang-servers/env" - whatsapp_config "github.com/rpsoftech/golang-servers/functions/whatsapp/config" - "github.com/rpsoftech/golang-servers/interfaces" - utility_functions "github.com/rpsoftech/golang-servers/utility/functions" - whatsapp_utility "github.com/rpsoftech/golang-servers/utility/whatsapp/utility" - "go.mau.fi/whatsmeow" - "go.mau.fi/whatsmeow/proto/waE2E" - "go.mau.fi/whatsmeow/types/events" - "google.golang.org/protobuf/proto" -) - -type ( - WhatsappConnection struct { - Client *whatsmeow.Client - Number string - Token string - ConnectionStatus int - QrCodeString string - SyncFinished bool - } - - IWhatsappConnectionMap map[string]*WhatsappConnection -) - -var ( - OutPutFilePath = "" - ConnectionMap = make(IWhatsappConnectionMap) -) - -func (connection *WhatsappConnection) ReturnStatusError() error { - switch connection.ConnectionStatus { - case 0: - return &interfaces.RequestError{ - StatusCode: http.StatusNotFound, - Code: interfaces.ERROR_CONNECTION_NOT_INITIALIZED, - Message: "Connection Not Initialized QR SCANNED", - Name: "ERROR_CONNECTION_NOT_INITIALIZED", - Extra: []string{connection.QrCodeString}, - } - case -1: - return &interfaces.RequestError{ - StatusCode: http.StatusNotFound, - Code: interfaces.ERROR_CONNECTION_LOGGED_OUT, - Message: "Connection Logged Out", - Name: "ERROR_CONNECTION_LOGGED_OUT", - } - } - return nil -} - -func (connection *WhatsappConnection) ConnectAndGetQRCode() { - if connection.Client.Store.ID == nil { - // No ID stored, new login - if whatsapp_config.Env.OPEN_BROWSER_FOR_SCAN { - go func(token string) { - utility_functions.OpenBrowser(fmt.Sprintf("http://127.0.0.1:%s/scan/%s", env.GetServerPort(env.PORT_KEY), token)) - }(connection.Token) - } - qrChan, _ := connection.Client.GetQRChannel(context.Background()) - err := connection.Client.Connect() - if err != nil { - println(err.Error()) - } - for evt := range qrChan { - if evt.Event == "code" { - fmt.Printf("QR code for %s\n", connection.Token) - connection.QrCodeString = evt.Code - // whatsapp_config.WhatsappNumberConfigMap.Tokens[connection.Token] = "Something" - if !whatsapp_config.Env.OPEN_BROWSER_FOR_SCAN { - qrterminal.GenerateHalfBlock(evt.Code, qrterminal.L, os.Stdout) - } - } else { - fmt.Println("Login event:", evt.Event) - } - } - } else { - // Already logged in, just connect - println("Connected") - err := connection.Client.Connect() - if err != nil { - println(err.Error()) - } - } -} -func (connection *WhatsappConnection) eventHandler(evt interface{}) { - switch v := evt.(type) { - case *events.LoggedOut: - // Send Status - // connection.ConnectionStatus = -1 - connection.Client.Logout(ctx) - connection.Client.Store.Delete(ctx) - println(connection.Number, " Logged Out") - connection.Client.Disconnect() - delete(ConnectionMap, connection.Token) - delete(whatsapp_config.WhatsappNumberConfigMap.Tokens, connection.Token) - delete(whatsapp_config.WhatsappNumberConfigMap.JID, connection.Token) - whatsapp_config.WhatsappNumberConfigMap.Save() - go connection.ConnectAndGetQRCode() - case *events.Connected: - // Send Status - connection.Client.Store.Save(ctx) - connection.Number = connection.Client.Store.ID.User - go func() { - whatsapp_config.WhatsappNumberConfigMap.JID[connection.Token] = connection.Client.Store.ID.String() - whatsapp_config.WhatsappNumberConfigMap.Save() - }() - connection.ConnectionStatus = 1 - println(connection.Number, " Logged In") - case *events.OfflineSyncPreview: - connection.SyncFinished = false - case *events.OfflineSyncCompleted: - connection.SyncFinished = true - default: - fmt.Printf("Event Occurred%s\n", reflect.TypeOf(v)) - } -} -func (connection *WhatsappConnection) SendTextMessage(to []string, msg string) *map[string]interface{} { - response := make(map[string]interface{}) - for _, number := range to { - IsOnWhatsappCheck, err := connection.Client.IsOnWhatsApp(ctx, []string{"+" + number}) - if err != nil { - AppendToOutPutFile(fmt.Sprintf("%s,false,Something Went Wrong %#v\n", number, err)) - // return - response[number] = false - continue - } - if len(IsOnWhatsappCheck) == 0 { - AppendToOutPutFile(fmt.Sprintf("%s,false,Number %s Not On Whatsapp\n", number, number)) - response[number] = false - continue - } - NumberOnWhatsapp := IsOnWhatsappCheck[0] - if !NumberOnWhatsapp.IsIn { - AppendToOutPutFile(fmt.Sprintf("%s,false,Number %s Not On Whatsapp\n", number, number)) - response[number] = false - continue - // return - } - targetJID := NumberOnWhatsapp.JID - fmt.Printf("sending Text To %s\n", number) - response[number] = false - if len(msg) > 0 { - resp, err := connection.Client.SendMessage(context.Background(), targetJID, &waE2E.Message{ - Conversation: proto.String(msg), - }) - if err == nil { - response[number] = resp - } - } - } - return &response -} -func (connection *WhatsappConnection) SendMediaFileBase64(to []string, base64Data string, fileName string, msg string) *map[string]bool { - // pdfBytes, err := os.ReadFile(filePath) - bytesData, err := base64.StdEncoding.DecodeString(base64Data) - if err != nil { - AppendToOutPutFile(fmt.Sprintf("false,Error While Reading File %#v\n", err)) - return nil - } - return connection.sendMediaFile(to, bytesData, fileName, msg) -} -func (connection *WhatsappConnection) SendMediaFileWithPath(to []string, filePath string, fileName string, msg string) *map[string]bool { - pdfBytes, err := os.ReadFile(filePath) - if err != nil { - AppendToOutPutFile(fmt.Sprintf("false,Error While Reading File %#v\n", err)) - return nil - } - return connection.sendMediaFile(to, pdfBytes, fileName, msg) -} -func (connection *WhatsappConnection) sendMediaFile(to []string, fileByte []byte, fileName string, msg string) *map[string]bool { - response := make(map[string]bool) - var docProto *waE2E.Message - for _, number := range to { - IsOnWhatsappCheck, err := connection.Client.IsOnWhatsApp(ctx, []string{"+" + number}) - if err != nil { - AppendToOutPutFile(fmt.Sprintf("%s,false,Something Went Wrong %#v\n", number, err)) - // return - response[number] = false - continue - } - NumberOnWhatsapp := IsOnWhatsappCheck[0] - if !NumberOnWhatsapp.IsIn { - AppendToOutPutFile(fmt.Sprintf("%s,false,Number %s Not On Whatsapp\n", number, number)) - response[number] = false - continue - // return - } - targetJID := NumberOnWhatsapp.JID - fmt.Printf("sending File To %s\n", number) - if docProto == nil { - extensionName := utility_functions.GetMime(fileName) - if strings.Contains(extensionName, "image") { - resp, err := connection.Client.Upload(context.Background(), fileByte, whatsmeow.MediaImage) - if err != nil { - AppendToOutPutFile(fmt.Sprintf("%s,false,Error While Uploading %#v\n", number, err)) - continue - } - jpegThumbnail, err := utility_functions.ImageThumbnail(fileByte) - if err != nil { - AppendToOutPutFile(fmt.Sprintf("%s,false,Error While Generating Thumbnail %#v\n", number, err)) - } - docProto = &waE2E.Message{ - ImageMessage: &waE2E.ImageMessage{ - Caption: proto.String(msg), - URL: &resp.URL, - Mimetype: proto.String(extensionName), - // FileName: &fileName, - DirectPath: &resp.DirectPath, - JPEGThumbnail: jpegThumbnail, - MediaKey: resp.MediaKey, - FileEncSHA256: resp.FileEncSHA256, - FileSHA256: resp.FileSHA256, - FileLength: &resp.FileLength, - }, - } - } else if strings.Contains(extensionName, "audio") { - resp, err := connection.Client.Upload(context.Background(), fileByte, whatsmeow.MediaAudio) - if err != nil { - AppendToOutPutFile(fmt.Sprintf("%s,false,Error While Uploading %#v\n", number, err)) - continue - } - docProto = &waE2E.Message{ - AudioMessage: &waE2E.AudioMessage{ - // Caption: proto.String(msg), - URL: &resp.URL, - Mimetype: proto.String(extensionName), - // FileName: &fileName, - DirectPath: &resp.DirectPath, - MediaKey: resp.MediaKey, - FileEncSHA256: resp.FileEncSHA256, - FileSHA256: resp.FileSHA256, - FileLength: &resp.FileLength, - }, - } - } else if strings.Contains(extensionName, "video") { - // var thumbResp *whatsmeow.UploadResponse - - thumbBytes, _ := utility_functions.GenerateVideoThumbnail(fileByte, fileName) - // thumbResp, _ := connection.Client.Upload(context.Background(), thumbBytes, whatsmeow.MediaImage) - // } - resp, err := connection.Client.Upload(context.Background(), fileByte, whatsmeow.MediaVideo) - if err != nil { - AppendToOutPutFile(fmt.Sprintf("%s,false,Error While Uploading %#v\n", number, err)) - continue - } - if len(thumbBytes) > 0 { - docProto = &waE2E.Message{ - VideoMessage: &waE2E.VideoMessage{ - Caption: proto.String(msg), - URL: &resp.URL, - Mimetype: proto.String(extensionName), - JPEGThumbnail: thumbBytes, - DirectPath: &resp.DirectPath, - MediaKey: resp.MediaKey, - FileEncSHA256: resp.FileEncSHA256, - FileSHA256: resp.FileSHA256, - FileLength: &resp.FileLength, - }, - } - } else { - docProto = &waE2E.Message{ - VideoMessage: &waE2E.VideoMessage{ - Caption: proto.String(msg), - URL: &resp.URL, - Mimetype: proto.String(extensionName), - DirectPath: &resp.DirectPath, - MediaKey: resp.MediaKey, - FileEncSHA256: resp.FileEncSHA256, - FileSHA256: resp.FileSHA256, - FileLength: &resp.FileLength, - }, - } - } - } else { - resp, err := connection.Client.Upload(context.Background(), fileByte, whatsmeow.MediaDocument) - if err != nil { - AppendToOutPutFile(fmt.Sprintf("%s,false,Error While Uploading %#v\n", number, err)) - continue - } - docProto = &waE2E.Message{ - DocumentMessage: &waE2E.DocumentMessage{ - Caption: proto.String(msg), - URL: &resp.URL, - Mimetype: proto.String(extensionName), - FileName: &fileName, - DirectPath: &resp.DirectPath, - MediaKey: resp.MediaKey, - FileEncSHA256: resp.FileEncSHA256, - FileSHA256: resp.FileSHA256, - FileLength: &resp.FileLength, - }, - } - println("finished uploading") - if strings.Contains(extensionName, "pdf") { - println("PDF to thumb") - thumb, err := whatsapp_utility.ExtractFirstPage(fileByte) - if err == nil && len(thumb) > 0 { - docProto.DocumentMessage.JPEGThumbnail = thumb - } else { - println(err.Error()) - } - } - } - } - response[number] = false - if docProto != nil { - _, err := connection.Client.SendMessage(context.Background(), targetJID, docProto) - if err == nil { - response[number] = true - } - } - } - return &response -} - -func AppendToOutPutFile(text string) { - f, err := os.OpenFile(OutPutFilePath, os.O_APPEND|os.O_WRONLY|os.O_CREATE, 0600) - if err != nil { - panic(err) - } - - defer f.Close() - - if _, err = f.WriteString(text); err != nil { - panic(err) - } -} diff --git a/utility/functions/file-exists.go b/utility/functions/file-exists.go index 048195d..e9a8efb 100644 --- a/utility/functions/file-exists.go +++ b/utility/functions/file-exists.go @@ -12,7 +12,7 @@ func Exist(path string) (bool, error) { return true, nil } if errors.Is(err, fs.ErrNotExist) { - return false, nil + return false, err } return false, err } diff --git a/utility/functions/gzip/compress-decompress.go b/utility/functions/gzip/compress-decompress.go new file mode 100644 index 0000000..6af7751 --- /dev/null +++ b/utility/functions/gzip/compress-decompress.go @@ -0,0 +1,53 @@ +package utility_functions_gzip + +import ( + "compress/gzip" + "io" + "os" +) + +func GzipCompressFile(src string, dst string) error { + + in, err := os.Open(src) + if err != nil { + return err + } + defer in.Close() + + out, err := os.Create(dst) + if err != nil { + return err + } + defer out.Close() + + gz := gzip.NewWriter(out) + defer gz.Close() + + _, err = io.Copy(gz, in) + + return err +} +func GzipDecompressFile(src string, dst string) error { + + in, err := os.Open(src) + if err != nil { + return err + } + defer in.Close() + + gz, err := gzip.NewReader(in) + if err != nil { + return err + } + defer gz.Close() + + out, err := os.Create(dst) + if err != nil { + return err + } + defer out.Close() + + _, err = io.Copy(out, gz) + + return err +} diff --git a/utility/mongodb/function-mongo.go b/utility/mongodb/function-mongo.go index f36105a..13bd6ec 100644 --- a/utility/mongodb/function-mongo.go +++ b/utility/mongodb/function-mongo.go @@ -1,10 +1,9 @@ package mongodb import ( - utility_functions "github.com/rpsoftech/golang-servers/utility/functions" - "go.mongodb.org/mongo-driver/bson" - "go.mongodb.org/mongo-driver/mongo" - "go.mongodb.org/mongo-driver/mongo/options" + "go.mongodb.org/mongo-driver/v2/bson" + "go.mongodb.org/mongo-driver/v2/mongo" + "go.mongodb.org/mongo-driver/v2/mongo/options" ) type MongoDbFilter struct { @@ -14,9 +13,7 @@ type MongoDbFilter struct { Skip int64 } -var FindOneAndUpdateOptions = &options.FindOneAndUpdateOptions{ - Upsert: utility_functions.BoolPointer(true), -} +var FindOneAndUpdateOptions = options.FindOneAndUpdate().SetUpsert(true) func AddComboUniqueIndexesToCollection(UniqueIndexes []string, collection *mongo.Collection) { i := bson.D{} diff --git a/utility/mongodb/index.go b/utility/mongodb/index.go index 55629f3..b19ad99 100644 --- a/utility/mongodb/index.go +++ b/utility/mongodb/index.go @@ -4,8 +4,8 @@ import ( "context" "github.com/rpsoftech/golang-servers/env" - "go.mongodb.org/mongo-driver/mongo" - "go.mongodb.org/mongo-driver/mongo/options" + "go.mongodb.org/mongo-driver/v2/mongo" + "go.mongodb.org/mongo-driver/v2/mongo/options" ) type MongoDBConfig struct { @@ -27,7 +27,7 @@ func init() { } env.ValidateEnv(config) // env.Env.DB_URL - client, err := mongo.Connect(MongoCtx, options.Client().ApplyURI(config.DB_URL).SetMinPoolSize(2)) + client, err := mongo.Connect(options.Client().ApplyURI(config.DB_URL).SetMinPoolSize(2)) if err != nil { panic(err) }