mirror of
https://codeberg.org/aryak/mozhi
synced 2025-06-04 00:41:07 +05:30
Compare commits
53 Commits
e80e5482f2
...
master
Author | SHA1 | Date | |
---|---|---|---|
c2c14988c0 | |||
|
abea631db5 | ||
|
2d66a57f4b | ||
8afe335696
|
|||
dd92b0279d
|
|||
0e3c7b9e2a | |||
|
c0b2638d8b | ||
d6a46dc819 | |||
|
daffe3a9ae | ||
eb17a3a0f8
|
|||
5c99ac4007 | |||
60e3e48011
|
|||
|
15acd5605d | ||
|
e52b42dfab | ||
254a0446b4
|
|||
cf7713461a
|
|||
0f72048b11
|
|||
2f63e58e4d
|
|||
6acd8e6658
|
|||
8d3855589f
|
|||
099885f315 | |||
|
a98b9987e3 | ||
7d23e2f01e | |||
|
010dc7e8d7 | ||
a2789b2a53
|
|||
31bb18994b
|
|||
622cae2d9c
|
|||
687315602a
|
|||
306f23592b | |||
|
31c8aeba93 | ||
0c2c0f7dfd
|
|||
a2ac174314
|
|||
8189007bda
|
|||
934616c72f | |||
bead1df6df
|
|||
3299056e59
|
|||
aad4b83079
|
|||
c233475390
|
|||
084aa94c3b
|
|||
aea1812e50
|
|||
9980b6559c
|
|||
acd67ba0ab
|
|||
fc863bbd9b
|
|||
828acac748
|
|||
b41ada9128
|
|||
|
251df5cdd8 | ||
f38dcd8647 | |||
592ca052f8 | |||
197949150d
|
|||
16813c4db5
|
|||
8bb5f19af0 | |||
5514128db3 | |||
|
5783c54e45 |
@@ -7,11 +7,11 @@ RUN apk --no-cache add git
|
||||
COPY . .
|
||||
|
||||
ENV GOPRIVATE=codeberg.org/aryak/libmozhi
|
||||
RUN go mod download
|
||||
#RUN go mod download
|
||||
RUN go run github.com/swaggo/swag/cmd/swag@latest init --parseDependency
|
||||
RUN CGO_ENABLED=0 GOOS=linux GOARCH=$TARGETARCH go build -o /src/mozhi
|
||||
|
||||
FROM alpine:3.16 as bin
|
||||
FROM alpine:3.16 AS bin
|
||||
|
||||
WORKDIR /app
|
||||
COPY --from=build /src/mozhi .
|
||||
|
14
README.md
14
README.md
@@ -23,7 +23,11 @@ I'm initially focusing on the api and engines, but eventually Mozhi will have a
|
||||
- LibreTranslate
|
||||
- Yandex
|
||||
- MyMemory
|
||||
- DuckDuckGo (almost 1-1 with Bing Translate)
|
||||
- DuckDuckGo ( 1-1 with Bing Translate )
|
||||
|
||||
## Projects that use Mozhi
|
||||
- [select2translate](https://codeberg.org/aryak/select2translate) - Translate text from your selection clipboard using Mozhi
|
||||
- [Crow Translate](https://invent.kde.org/office/crow-translate) - KDE Project written in C++ / Qt that allows you to translate and speak text using Mozhi
|
||||
|
||||
## Where is the engine code?
|
||||
The engine code has recently been split from the main codebase. Please check [aryak/libmozhi](https://codeberg.org/aryak/libmozhi) for it.
|
||||
@@ -70,11 +74,17 @@ These envvars turn off/on engines. By default all of them are enabled.
|
||||
| Link | Cloudflare | Country | ISP |
|
||||
| -------- | ---------- | ----------- | ----- |
|
||||
| [mozhi.aryak.me](https://mozhi.aryak.me) | No | India | Airtel |
|
||||
| [translate.bus-hit.me](https://translate.bus-hit.me) | No | Canada | Oracle |
|
||||
| [nyc1.mz.ggtyler.dev](https://nyc1.mz.ggtyler.dev) | No | USA | Royale Hosting |
|
||||
| [translate.projectsegfau.lt](https://translate.projectsegfau.lt) | No | Germany / USA / India | Avoro / Racknerd / Airtel |
|
||||
| [translate.nerdvpn.de](https://translate.nerdvpn.de) | No | Ukraine | vsys.host |
|
||||
| [mozhi.ducks.party](https://mozhi.ducks.party) | No | Germany | Datalix |
|
||||
| [mozhi.pussthecat.org](https://mozhi.pussthecat.org) | No | Germany | Hetzner |
|
||||
| [mozhi.adminforge.de](https://mozhi.adminforge.de) | No | Germany | Hetzner |
|
||||
| [translate.privacyredirect.com](https://translate.privacyredirect.com) | No | Finland | Private WebHost |
|
||||
| [mozhi.canine.tools](https://mozhi.canine.tools) | No | USA | RoyaleHosting |
|
||||
| [mzh.dc09.ru](https://mzh.dc09.ru) | No | Russia | TimeWeb Cloud |
|
||||
| [mozhi.franklyflawless.org](https://mozhi.franklyflawless.org) | No | Germany | Hetzner |
|
||||
| [mozhi.frontendfriendly.xyz (Tor)](http://mozhi.wsuno6lnjdcsiok5mrxvl6e2bdex7nhsqqav6ux7tkwrqiqnulejfbyd.onion) | No | USA | Hetzner |
|
||||
| [mozhi.ducks.party (Tor)](http://42i2bzogwkph3dvoo2bm6srskf7vvabsphw7uzftymbjjlzgfluhnmid.onion) | No | Germany | Datalix |
|
||||
|
||||
## Features
|
||||
|
@@ -3,6 +3,7 @@ package cmd
|
||||
import (
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"strings"
|
||||
|
||||
"codeberg.org/aryak/libmozhi"
|
||||
|
||||
@@ -11,6 +12,7 @@ import (
|
||||
|
||||
var (
|
||||
engine string
|
||||
engines string
|
||||
query string
|
||||
source string
|
||||
dest string
|
||||
@@ -29,10 +31,6 @@ func printEngineResult(result libmozhi.LangOut, printPlaceHolderAndEngineName bo
|
||||
}
|
||||
fmt.Println("Source Language: " + result.SourceLang)
|
||||
fmt.Println("Target Language: " + result.TargetLang)
|
||||
|
||||
if printPlaceHolderAndEngineName {
|
||||
fmt.Println("-----------------------------------")
|
||||
}
|
||||
}
|
||||
|
||||
func printRaw(data interface{}) {
|
||||
@@ -56,6 +54,25 @@ var translateCmd = &cobra.Command{
|
||||
for _, result := range data {
|
||||
printEngineResult(result, true)
|
||||
}
|
||||
fmt.Println("-----------------------------------")
|
||||
}
|
||||
} else if engine == "some" {
|
||||
if engines != "" {
|
||||
data, err := libmozhi.TranslateSome(strings.Split(engines, ","), dest, source, query)
|
||||
if rawjson {
|
||||
printRaw(data)
|
||||
} else {
|
||||
if err != nil {
|
||||
fmt.Println(err)
|
||||
} else {
|
||||
for _, result := range data {
|
||||
printEngineResult(result, true)
|
||||
}
|
||||
fmt.Println("-----------------------------------")
|
||||
}
|
||||
}
|
||||
} else {
|
||||
fmt.Println("Please add the --engines / -E argument when using the engine `some`")
|
||||
}
|
||||
} else {
|
||||
data, err := libmozhi.Translate(engine, dest, source, query)
|
||||
@@ -76,13 +93,13 @@ func init() {
|
||||
rootCmd.AddCommand(translateCmd)
|
||||
translateCmd.Flags().SortFlags = false
|
||||
|
||||
translateCmd.Flags().StringVarP(&engine, "engine", "e", "", "[all|google|libre|reverso|deepl|yandex|mymemory|duckduckgo]")
|
||||
translateCmd.Flags().StringVarP(&engine, "engine", "e", "", "[all|some|google|libre|reverso|deepl|yandex|mymemory|duckduckgo]")
|
||||
translateCmd.Flags().StringVarP(&engines, "engines", "E", "", "Engines to select. This flag is to be used with the `some` engine only")
|
||||
translateCmd.Flags().StringVarP(&source, "source", "s", "", "Source language. Use langlist command to get code for your language")
|
||||
translateCmd.Flags().StringVarP(&dest, "dest", "t", "", "Target language. Use langlist command to get code for your language")
|
||||
translateCmd.Flags().StringVarP(&query, "query", "q", "", "Text to be translated")
|
||||
translateCmd.Flags().BoolVarP(&rawjson, "raw", "r", false, "Return output as json")
|
||||
|
||||
translateCmd.MarkFlagRequired("engine")
|
||||
translateCmd.MarkFlagRequired("source")
|
||||
translateCmd.MarkFlagRequired("dest")
|
||||
translateCmd.MarkFlagRequired("query")
|
||||
|
@@ -1,4 +1,3 @@
|
||||
version: "3"
|
||||
services:
|
||||
mozhi:
|
||||
#build: .
|
||||
@@ -10,4 +9,4 @@ services:
|
||||
test: wget -nv --tries=1 --spider http://127.0.0.1:3000/api/version || exit 1
|
||||
interval: 30s
|
||||
timeout: 5s
|
||||
retries: 2
|
||||
retries: 2
|
61
docs/docs.go
61
docs/docs.go
@@ -41,28 +41,28 @@ const docTemplate = `{
|
||||
"type": "string",
|
||||
"description": "Engine name",
|
||||
"name": "engine",
|
||||
"in": "query",
|
||||
"in": "formData",
|
||||
"required": true
|
||||
},
|
||||
{
|
||||
"type": "string",
|
||||
"description": "Source language",
|
||||
"name": "from",
|
||||
"in": "query",
|
||||
"in": "formData",
|
||||
"required": true
|
||||
},
|
||||
{
|
||||
"type": "string",
|
||||
"description": "Target language",
|
||||
"name": "to",
|
||||
"in": "query",
|
||||
"in": "formData",
|
||||
"required": true
|
||||
},
|
||||
{
|
||||
"type": "string",
|
||||
"description": "PNG image in base64 format",
|
||||
"type": "file",
|
||||
"description": "PNG image",
|
||||
"name": "image",
|
||||
"in": "query",
|
||||
"in": "formData",
|
||||
"required": true
|
||||
}
|
||||
],
|
||||
@@ -227,15 +227,57 @@ const docTemplate = `{
|
||||
"engine": {
|
||||
"type": "string"
|
||||
},
|
||||
"source_antonyms": {
|
||||
"type": "array",
|
||||
"items": {
|
||||
"type": "string"
|
||||
}
|
||||
},
|
||||
"source_equivalent_target_lang": {
|
||||
"type": "object",
|
||||
"additionalProperties": {
|
||||
"type": "array",
|
||||
"items": {
|
||||
"type": "string"
|
||||
}
|
||||
}
|
||||
},
|
||||
"source_language": {
|
||||
"type": "string"
|
||||
},
|
||||
"source_synonyms": {
|
||||
"type": "array",
|
||||
"items": {
|
||||
"type": "string"
|
||||
}
|
||||
},
|
||||
"source_transliteration": {
|
||||
"type": "string"
|
||||
},
|
||||
"target_antonyms": {
|
||||
"type": "array",
|
||||
"items": {
|
||||
"type": "string"
|
||||
}
|
||||
},
|
||||
"target_equivalent_source_lang": {
|
||||
"type": "object",
|
||||
"additionalProperties": {
|
||||
"type": "array",
|
||||
"items": {
|
||||
"type": "string"
|
||||
}
|
||||
}
|
||||
},
|
||||
"target_language": {
|
||||
"type": "string"
|
||||
},
|
||||
"target_synonyms": {
|
||||
"type": "array",
|
||||
"items": {
|
||||
"type": "string"
|
||||
}
|
||||
},
|
||||
"target_transliteration": {
|
||||
"type": "string"
|
||||
},
|
||||
@@ -264,6 +306,13 @@ const docTemplate = `{
|
||||
"libmozhi.WordChoices": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"definition": {
|
||||
"type": "string"
|
||||
},
|
||||
"example": {
|
||||
"description": "Example is for google alone; since it does not have a linked example for source \u0026 target",
|
||||
"type": "string"
|
||||
},
|
||||
"examples_source": {
|
||||
"type": "array",
|
||||
"items": {
|
||||
|
@@ -30,28 +30,28 @@
|
||||
"type": "string",
|
||||
"description": "Engine name",
|
||||
"name": "engine",
|
||||
"in": "query",
|
||||
"in": "formData",
|
||||
"required": true
|
||||
},
|
||||
{
|
||||
"type": "string",
|
||||
"description": "Source language",
|
||||
"name": "from",
|
||||
"in": "query",
|
||||
"in": "formData",
|
||||
"required": true
|
||||
},
|
||||
{
|
||||
"type": "string",
|
||||
"description": "Target language",
|
||||
"name": "to",
|
||||
"in": "query",
|
||||
"in": "formData",
|
||||
"required": true
|
||||
},
|
||||
{
|
||||
"type": "string",
|
||||
"description": "PNG image in base64 format",
|
||||
"type": "file",
|
||||
"description": "PNG image",
|
||||
"name": "image",
|
||||
"in": "query",
|
||||
"in": "formData",
|
||||
"required": true
|
||||
}
|
||||
],
|
||||
@@ -216,15 +216,57 @@
|
||||
"engine": {
|
||||
"type": "string"
|
||||
},
|
||||
"source_antonyms": {
|
||||
"type": "array",
|
||||
"items": {
|
||||
"type": "string"
|
||||
}
|
||||
},
|
||||
"source_equivalent_target_lang": {
|
||||
"type": "object",
|
||||
"additionalProperties": {
|
||||
"type": "array",
|
||||
"items": {
|
||||
"type": "string"
|
||||
}
|
||||
}
|
||||
},
|
||||
"source_language": {
|
||||
"type": "string"
|
||||
},
|
||||
"source_synonyms": {
|
||||
"type": "array",
|
||||
"items": {
|
||||
"type": "string"
|
||||
}
|
||||
},
|
||||
"source_transliteration": {
|
||||
"type": "string"
|
||||
},
|
||||
"target_antonyms": {
|
||||
"type": "array",
|
||||
"items": {
|
||||
"type": "string"
|
||||
}
|
||||
},
|
||||
"target_equivalent_source_lang": {
|
||||
"type": "object",
|
||||
"additionalProperties": {
|
||||
"type": "array",
|
||||
"items": {
|
||||
"type": "string"
|
||||
}
|
||||
}
|
||||
},
|
||||
"target_language": {
|
||||
"type": "string"
|
||||
},
|
||||
"target_synonyms": {
|
||||
"type": "array",
|
||||
"items": {
|
||||
"type": "string"
|
||||
}
|
||||
},
|
||||
"target_transliteration": {
|
||||
"type": "string"
|
||||
},
|
||||
@@ -253,6 +295,13 @@
|
||||
"libmozhi.WordChoices": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"definition": {
|
||||
"type": "string"
|
||||
},
|
||||
"example": {
|
||||
"description": "Example is for google alone; since it does not have a linked example for source \u0026 target",
|
||||
"type": "string"
|
||||
},
|
||||
"examples_source": {
|
||||
"type": "array",
|
||||
"items": {
|
||||
|
@@ -20,12 +20,40 @@ definitions:
|
||||
type: string
|
||||
engine:
|
||||
type: string
|
||||
source_antonyms:
|
||||
items:
|
||||
type: string
|
||||
type: array
|
||||
source_equivalent_target_lang:
|
||||
additionalProperties:
|
||||
items:
|
||||
type: string
|
||||
type: array
|
||||
type: object
|
||||
source_language:
|
||||
type: string
|
||||
source_synonyms:
|
||||
items:
|
||||
type: string
|
||||
type: array
|
||||
source_transliteration:
|
||||
type: string
|
||||
target_antonyms:
|
||||
items:
|
||||
type: string
|
||||
type: array
|
||||
target_equivalent_source_lang:
|
||||
additionalProperties:
|
||||
items:
|
||||
type: string
|
||||
type: array
|
||||
type: object
|
||||
target_language:
|
||||
type: string
|
||||
target_synonyms:
|
||||
items:
|
||||
type: string
|
||||
type: array
|
||||
target_transliteration:
|
||||
type: string
|
||||
translated-text:
|
||||
@@ -44,6 +72,12 @@ definitions:
|
||||
type: object
|
||||
libmozhi.WordChoices:
|
||||
properties:
|
||||
definition:
|
||||
type: string
|
||||
example:
|
||||
description: Example is for google alone; since it does not have a linked
|
||||
example for source & target
|
||||
type: string
|
||||
examples_source:
|
||||
items:
|
||||
type: string
|
||||
@@ -74,25 +108,25 @@ paths:
|
||||
description: When engine is set to all, it will return an array of libmozhi.LangOut.
|
||||
parameters:
|
||||
- description: Engine name
|
||||
in: query
|
||||
in: formData
|
||||
name: engine
|
||||
required: true
|
||||
type: string
|
||||
- description: Source language
|
||||
in: query
|
||||
in: formData
|
||||
name: from
|
||||
required: true
|
||||
type: string
|
||||
- description: Target language
|
||||
in: query
|
||||
in: formData
|
||||
name: to
|
||||
required: true
|
||||
type: string
|
||||
- description: PNG image in base64 format
|
||||
in: query
|
||||
- description: PNG image
|
||||
in: formData
|
||||
name: image
|
||||
required: true
|
||||
type: string
|
||||
type: file
|
||||
responses:
|
||||
"200":
|
||||
description: OK
|
||||
|
83
go.mod
83
go.mod
@@ -1,74 +1,87 @@
|
||||
module codeberg.org/aryak/mozhi
|
||||
|
||||
go 1.21.0
|
||||
|
||||
replace github.com/OwO-Network/gdeeplx => github.com/gi-yt/gdeeplx v0.0.0-20230817133036-0eb71706cd51
|
||||
go 1.24.2
|
||||
|
||||
//replace codeberg.org/aryak/libmozhi => /home/arya/projects/mozhi/libmozhi
|
||||
|
||||
require (
|
||||
codeberg.org/aryak/libmozhi v0.0.0-20240527100901-0c320169b981
|
||||
github.com/gofiber/fiber/v2 v2.52.4
|
||||
github.com/gofiber/swagger v1.0.0
|
||||
codeberg.org/aryak/libmozhi v0.0.0-20250410140317-de8f232ee6e5
|
||||
github.com/gofiber/fiber/v2 v2.52.6
|
||||
github.com/gofiber/swagger v1.1.1
|
||||
github.com/gofiber/template v1.8.0
|
||||
github.com/joho/godotenv v1.5.1
|
||||
github.com/ktr0731/go-fuzzyfinder v0.8.0
|
||||
github.com/spf13/cobra v1.8.0
|
||||
github.com/swaggo/swag v1.16.3
|
||||
github.com/spf13/cobra v1.9.1
|
||||
github.com/swaggo/swag v1.16.4
|
||||
)
|
||||
|
||||
require (
|
||||
github.com/KyleBanks/depth v1.2.1 // indirect
|
||||
github.com/OwO-Network/gdeeplx v0.0.1 // indirect
|
||||
github.com/PuerkitoBio/goquery v1.9.2 // indirect
|
||||
github.com/OwO-Network/DeepLX v1.0.7 // indirect
|
||||
github.com/PuerkitoBio/goquery v1.10.2 // indirect
|
||||
github.com/abadojack/whatlanggo v1.0.1 // indirect
|
||||
github.com/andybalholm/brotli v1.1.0 // indirect
|
||||
github.com/andybalholm/cascadia v1.3.2 // indirect
|
||||
github.com/antchfx/htmlquery v1.3.1 // indirect
|
||||
github.com/antchfx/xmlquery v1.4.0 // indirect
|
||||
github.com/antchfx/xpath v1.3.0 // indirect
|
||||
github.com/carlmjohnson/requests v0.23.5 // indirect
|
||||
github.com/andybalholm/brotli v1.1.1 // indirect
|
||||
github.com/andybalholm/cascadia v1.3.3 // indirect
|
||||
github.com/antchfx/htmlquery v1.3.4 // indirect
|
||||
github.com/antchfx/xmlquery v1.4.4 // indirect
|
||||
github.com/antchfx/xpath v1.3.4 // indirect
|
||||
github.com/carlmjohnson/requests v0.24.3 // indirect
|
||||
github.com/cloudflare/circl v1.6.1 // indirect
|
||||
github.com/gdamore/encoding v1.0.1 // indirect
|
||||
github.com/gdamore/tcell/v2 v2.7.4 // indirect
|
||||
github.com/go-openapi/jsonpointer v0.21.0 // indirect
|
||||
github.com/gdamore/tcell/v2 v2.8.1 // indirect
|
||||
github.com/go-openapi/jsonpointer v0.21.1 // indirect
|
||||
github.com/go-openapi/jsonreference v0.21.0 // indirect
|
||||
github.com/go-openapi/spec v0.21.0 // indirect
|
||||
github.com/go-openapi/swag v0.23.0 // indirect
|
||||
github.com/go-openapi/swag v0.23.1 // indirect
|
||||
github.com/go-task/slim-sprig/v3 v3.0.0 // indirect
|
||||
github.com/gobwas/glob v0.2.3 // indirect
|
||||
github.com/gocolly/colly v1.2.0 // indirect
|
||||
github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect
|
||||
github.com/golang/groupcache v0.0.0-20241129210726-2c02b8208cf8 // indirect
|
||||
github.com/golang/protobuf v1.5.4 // indirect
|
||||
github.com/google/go-querystring v1.1.0 // indirect
|
||||
github.com/google/pprof v0.0.0-20250403155104-27863c87afa6 // indirect
|
||||
github.com/google/uuid v1.6.0 // indirect
|
||||
github.com/hashicorp/errwrap v1.1.0 // indirect
|
||||
github.com/hashicorp/go-multierror v1.1.1 // indirect
|
||||
github.com/imroc/req/v3 v3.50.0 // indirect
|
||||
github.com/inconshreveable/mousetrap v1.1.0 // indirect
|
||||
github.com/josharian/intern v1.0.0 // indirect
|
||||
github.com/kennygrant/sanitize v1.2.4 // indirect
|
||||
github.com/klauspost/compress v1.17.8 // indirect
|
||||
github.com/klauspost/compress v1.18.0 // indirect
|
||||
github.com/ktr0731/go-ansisgr v0.1.0 // indirect
|
||||
github.com/lucasb-eyer/go-colorful v1.2.0 // indirect
|
||||
github.com/mailru/easyjson v0.7.7 // indirect
|
||||
github.com/mattn/go-colorable v0.1.13 // indirect
|
||||
github.com/mailru/easyjson v0.9.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.15 // indirect
|
||||
github.com/mattn/go-runewidth v0.0.16 // indirect
|
||||
github.com/nsf/termbox-go v1.1.1 // indirect
|
||||
github.com/onsi/ginkgo/v2 v2.23.4 // indirect
|
||||
github.com/pkg/errors v0.9.1 // indirect
|
||||
github.com/quic-go/qpack v0.5.1 // indirect
|
||||
github.com/quic-go/quic-go v0.50.1 // indirect
|
||||
github.com/refraction-networking/utls v1.6.7 // indirect
|
||||
github.com/rivo/uniseg v0.4.7 // indirect
|
||||
github.com/saintfish/chardet v0.0.0-20230101081208-5e3ef4b5456d // indirect
|
||||
github.com/spf13/pflag v1.0.5 // indirect
|
||||
github.com/swaggo/files/v2 v2.0.0 // indirect
|
||||
github.com/spf13/pflag v1.0.6 // indirect
|
||||
github.com/swaggo/files/v2 v2.0.2 // indirect
|
||||
github.com/temoto/robotstxt v1.1.2 // indirect
|
||||
github.com/tidwall/gjson v1.17.1 // indirect
|
||||
github.com/tidwall/gjson v1.18.0 // indirect
|
||||
github.com/tidwall/match v1.1.1 // indirect
|
||||
github.com/tidwall/pretty v1.2.1 // indirect
|
||||
github.com/valyala/bytebufferpool v1.0.0 // indirect
|
||||
github.com/valyala/fasthttp v1.54.0 // indirect
|
||||
github.com/valyala/tcplisten v1.0.0 // indirect
|
||||
golang.org/x/net v0.25.0 // indirect
|
||||
golang.org/x/sys v0.20.0 // indirect
|
||||
golang.org/x/term v0.20.0 // indirect
|
||||
golang.org/x/text v0.15.0 // indirect
|
||||
golang.org/x/tools v0.21.0 // indirect
|
||||
github.com/valyala/fasthttp v1.60.0 // indirect
|
||||
go.uber.org/automaxprocs v1.6.0 // indirect
|
||||
go.uber.org/mock v0.5.1 // indirect
|
||||
golang.org/x/crypto v0.37.0 // indirect
|
||||
golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0 // indirect
|
||||
golang.org/x/mod v0.24.0 // indirect
|
||||
golang.org/x/net v0.39.0 // indirect
|
||||
golang.org/x/sync v0.13.0 // indirect
|
||||
golang.org/x/sys v0.32.0 // indirect
|
||||
golang.org/x/term v0.31.0 // indirect
|
||||
golang.org/x/text v0.24.0 // indirect
|
||||
golang.org/x/tools v0.32.0 // indirect
|
||||
google.golang.org/appengine v1.6.8 // indirect
|
||||
google.golang.org/protobuf v1.34.1 // indirect
|
||||
google.golang.org/protobuf v1.36.6 // indirect
|
||||
gopkg.in/yaml.v3 v3.0.1 // indirect
|
||||
)
|
||||
|
201
go.sum
201
go.sum
@@ -45,8 +45,8 @@ cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0Zeo
|
||||
cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk=
|
||||
cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs=
|
||||
cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0=
|
||||
codeberg.org/aryak/libmozhi v0.0.0-20240527100901-0c320169b981 h1:1dGcjkMpoRZhRA5Y9Ik/22Yp9hFpm5/csJ+eZZCODGQ=
|
||||
codeberg.org/aryak/libmozhi v0.0.0-20240527100901-0c320169b981/go.mod h1:cLOtjCmU2AsoL1B+kOzjOMWXYcsdewK8A5s5d/lQVBM=
|
||||
codeberg.org/aryak/libmozhi v0.0.0-20250410140317-de8f232ee6e5 h1:+ES8szNmss5vGzt0GIOhqsqPpzwZMKbCJxQLs6zUsJA=
|
||||
codeberg.org/aryak/libmozhi v0.0.0-20250410140317-de8f232ee6e5/go.mod h1:CfcKH8GWSdPaV6iZYAbCeTWegpPo+t+fJdihMGAeBU8=
|
||||
dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU=
|
||||
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
|
||||
github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=
|
||||
@@ -58,8 +58,10 @@ github.com/Joker/jade v1.1.3/go.mod h1:T+2WLyt7VH6Lp0TRxQrUYEs64nRc83wkMQrfeIQKd
|
||||
github.com/KyleBanks/depth v1.2.1 h1:5h8fQADFrWtarTdtDudMmGsC7GPbOAu6RVB3ffsVFHc=
|
||||
github.com/KyleBanks/depth v1.2.1/go.mod h1:jzSb9d0L43HxTQfT+oSA1EEp2q+ne2uh6XgeJcm8brE=
|
||||
github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU=
|
||||
github.com/PuerkitoBio/goquery v1.9.2 h1:4/wZksC3KgkQw7SQgkKotmKljk0M6V8TUvA8Wb4yPeE=
|
||||
github.com/PuerkitoBio/goquery v1.9.2/go.mod h1:GHPCaP0ODyyxqcNoFGYlAprUFH81NuRPd0GX3Zu2Mvk=
|
||||
github.com/OwO-Network/DeepLX v1.0.7 h1:a5oQ7aJM/bBe7HL27LU7YvbWWakQO888CFw2BSESsw0=
|
||||
github.com/OwO-Network/DeepLX v1.0.7/go.mod h1:ZCewUAXEk60YXOTPkBU8XJKt91lL+rVy+9pOC3r9mJQ=
|
||||
github.com/PuerkitoBio/goquery v1.10.2 h1:7fh2BdHcG6VFZsK7toXBT/Bh1z5Wmy8Q9MV9HqT2AM8=
|
||||
github.com/PuerkitoBio/goquery v1.10.2/go.mod h1:0guWGjcLu9AYC7C1GHnpysHy056u9aEkUHwhdnePMCU=
|
||||
github.com/abadojack/whatlanggo v1.0.1 h1:19N6YogDnf71CTHm3Mp2qhYfkRdyvbgwWdd2EPxJRG4=
|
||||
github.com/abadojack/whatlanggo v1.0.1/go.mod h1:66WiQbSbJBIlOZMsvbKe5m6pzQovxCH9B/K8tQB2uoc=
|
||||
github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
|
||||
@@ -67,16 +69,17 @@ github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuy
|
||||
github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=
|
||||
github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=
|
||||
github.com/andybalholm/brotli v1.0.5/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig=
|
||||
github.com/andybalholm/brotli v1.1.0 h1:eLKJA0d02Lf0mVpIDgYnqXcUn0GqVmEFny3VuID1U3M=
|
||||
github.com/andybalholm/brotli v1.1.0/go.mod h1:sms7XGricyQI9K10gOSf56VKKWS4oLer58Q+mhRPtnY=
|
||||
github.com/andybalholm/cascadia v1.3.2 h1:3Xi6Dw5lHF15JtdcmAHD3i1+T8plmv7BQ/nsViSLyss=
|
||||
github.com/andybalholm/cascadia v1.3.2/go.mod h1:7gtRlve5FxPPgIgX36uWBX58OdBsSS6lUvCFb+h7KvU=
|
||||
github.com/antchfx/htmlquery v1.3.1 h1:wm0LxjLMsZhRHfQKKZscDf2COyH4vDYA3wyH+qZ+Ylc=
|
||||
github.com/antchfx/htmlquery v1.3.1/go.mod h1:PTj+f1V2zksPlwNt7uVvZPsxpKNa7mlVliCRxLX6Nx8=
|
||||
github.com/antchfx/xmlquery v1.4.0 h1:xg2HkfcRK2TeTbdb0m1jxCYnvsPaGY/oeZWTGqX/0hA=
|
||||
github.com/antchfx/xmlquery v1.4.0/go.mod h1:Ax2aeaeDjfIw3CwXKDQ0GkwZ6QlxoChlIBP+mGnDFjI=
|
||||
github.com/antchfx/xpath v1.3.0 h1:nTMlzGAK3IJ0bPpME2urTuFL76o4A96iYvoKFHRXJgc=
|
||||
github.com/antchfx/xpath v1.3.0/go.mod h1:i54GszH55fYfBmoZXapTHN8T8tkcHfRgLyVwwqzXNcs=
|
||||
github.com/andybalholm/brotli v1.1.1 h1:PR2pgnyFznKEugtsUo0xLdDop5SKXd5Qf5ysW+7XdTA=
|
||||
github.com/andybalholm/brotli v1.1.1/go.mod h1:05ib4cKhjx3OQYUY22hTVd34Bc8upXjOLL2rKwwZBoA=
|
||||
github.com/andybalholm/cascadia v1.3.3 h1:AG2YHrzJIm4BZ19iwJ/DAua6Btl3IwJX+VI4kktS1LM=
|
||||
github.com/andybalholm/cascadia v1.3.3/go.mod h1:xNd9bqTn98Ln4DwST8/nG+H0yuB8Hmgu1YHNnWw0GeA=
|
||||
github.com/antchfx/htmlquery v1.3.4 h1:Isd0srPkni2iNTWCwVj/72t7uCphFeor5Q8nCzj1jdQ=
|
||||
github.com/antchfx/htmlquery v1.3.4/go.mod h1:K9os0BwIEmLAvTqaNSua8tXLWRWZpocZIH73OzWQbwM=
|
||||
github.com/antchfx/xmlquery v1.4.4 h1:mxMEkdYP3pjKSftxss4nUHfjBhnMk4imGoR96FRY2dg=
|
||||
github.com/antchfx/xmlquery v1.4.4/go.mod h1:AEPEEPYE9GnA2mj5Ur2L5Q5/2PycJ0N9Fusrx9b12fc=
|
||||
github.com/antchfx/xpath v1.3.3/go.mod h1:i54GszH55fYfBmoZXapTHN8T8tkcHfRgLyVwwqzXNcs=
|
||||
github.com/antchfx/xpath v1.3.4 h1:1ixrW1VnXd4HurCj7qnqnR0jo14g8JMe20Fshg1Vgz4=
|
||||
github.com/antchfx/xpath v1.3.4/go.mod h1:i54GszH55fYfBmoZXapTHN8T8tkcHfRgLyVwwqzXNcs=
|
||||
github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY=
|
||||
github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o=
|
||||
github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY=
|
||||
@@ -88,8 +91,8 @@ github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24
|
||||
github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8=
|
||||
github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=
|
||||
github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs=
|
||||
github.com/carlmjohnson/requests v0.23.5 h1:NPANcAofwwSuC6SIMwlgmHry2V3pLrSqRiSBKYbNHHA=
|
||||
github.com/carlmjohnson/requests v0.23.5/go.mod h1:zG9P28thdRnN61aD7iECFhH5iGGKX2jIjKQD9kqYH+o=
|
||||
github.com/carlmjohnson/requests v0.24.3 h1:LYcM/jVIVPkioigMjEAnBACXl2vb42TVqiC8EYNoaXQ=
|
||||
github.com/carlmjohnson/requests v0.24.3/go.mod h1:duYA/jDnyZ6f3xbcF5PpZ9N8clgopubP2nK5i6MVMhU=
|
||||
github.com/cbroglie/mustache v1.4.0/go.mod h1:SS1FTIghy0sjse4DUVGV1k/40B1qE1XkD9DtDsHo9iM=
|
||||
github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
|
||||
github.com/census-instrumentation/opencensus-proto v0.3.0/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
|
||||
@@ -102,6 +105,8 @@ github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMn
|
||||
github.com/circonus-labs/circonus-gometrics v2.3.1+incompatible/go.mod h1:nmEj6Dob7S7YxXgwXpfOuvO54S+tGdZdw9fuRZt25Ag=
|
||||
github.com/circonus-labs/circonusllhist v0.1.3/go.mod h1:kMXHVDlOchFAehlya5ePtbp5jckzBHf4XRpQvBOLI+I=
|
||||
github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
|
||||
github.com/cloudflare/circl v1.6.1 h1:zqIqSPIndyBh1bjLVVDHMPpVKqp8Su/V+6MeDzzQBQ0=
|
||||
github.com/cloudflare/circl v1.6.1/go.mod h1:uddAzsPgqdMAYatqJ0lsjX1oECcQLIlRpzZh3pJrofs=
|
||||
github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc=
|
||||
github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=
|
||||
github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=
|
||||
@@ -115,7 +120,7 @@ github.com/cncf/xds/go v0.0.0-20211130200136-a8f946100490/go.mod h1:eXthEFrGJvWH
|
||||
github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk=
|
||||
github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc=
|
||||
github.com/cpuguy83/go-md2man/v2 v2.0.1/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o=
|
||||
github.com/cpuguy83/go-md2man/v2 v2.0.3/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o=
|
||||
github.com/cpuguy83/go-md2man/v2 v2.0.6/go.mod h1:oOW0eioCTA6cOiMLiUPZOpcVxMig6NIQQ7OS05n1F4g=
|
||||
github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=
|
||||
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
|
||||
@@ -141,11 +146,9 @@ github.com/gdamore/encoding v1.0.0/go.mod h1:alR0ol34c49FCSBLjhosxzcPHQbf2trDkoo
|
||||
github.com/gdamore/encoding v1.0.1 h1:YzKZckdBL6jVt2Gc+5p82qhrGiqMdG/eNs6Wy0u3Uhw=
|
||||
github.com/gdamore/encoding v1.0.1/go.mod h1:0Z0cMFinngz9kS1QfMjCP8TY7em3bZYeeklsSDPivEo=
|
||||
github.com/gdamore/tcell/v2 v2.6.0/go.mod h1:be9omFATkdr0D9qewWW3d+MEvl5dha+Etb5y65J2H8Y=
|
||||
github.com/gdamore/tcell/v2 v2.7.4 h1:sg6/UnTM9jGpZU+oFYAsDahfchWAFW8Xx2yFinNSAYU=
|
||||
github.com/gdamore/tcell/v2 v2.7.4/go.mod h1:dSXtXTSK0VsW1biw65DZLZ2NKr7j0qP/0J7ONmsraWg=
|
||||
github.com/gdamore/tcell/v2 v2.8.1 h1:KPNxyqclpWpWQlPLx6Xui1pMk8S+7+R37h3g07997NU=
|
||||
github.com/gdamore/tcell/v2 v2.8.1/go.mod h1:bj8ori1BG3OYMjmb3IklZVWfZUJ1UBQt9JXrOCOhGWw=
|
||||
github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=
|
||||
github.com/gi-yt/gdeeplx v0.0.0-20230817133036-0eb71706cd51 h1:UsBBzLOcgAHzumecyEwnwlvF/cfxizNJvVilj9zbQMc=
|
||||
github.com/gi-yt/gdeeplx v0.0.0-20230817133036-0eb71706cd51/go.mod h1:xLqaj0n6E2VmiI1RXBOFy8wLoiOurvO3O6QxUvepyVo=
|
||||
github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU=
|
||||
github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=
|
||||
github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=
|
||||
@@ -153,25 +156,29 @@ github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2
|
||||
github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=
|
||||
github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE=
|
||||
github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk=
|
||||
github.com/go-openapi/jsonpointer v0.21.0 h1:YgdVicSA9vH5RiHs9TZW5oyafXZFc6+2Vc1rr/O9oNQ=
|
||||
github.com/go-openapi/jsonpointer v0.21.0/go.mod h1:IUyH9l/+uyhIYQ/PXVA41Rexl+kOkAPDdXEYns6fzUY=
|
||||
github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY=
|
||||
github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=
|
||||
github.com/go-openapi/jsonpointer v0.21.1 h1:whnzv/pNXtK2FbX/W9yJfRmE2gsmkfahjMKB0fZvcic=
|
||||
github.com/go-openapi/jsonpointer v0.21.1/go.mod h1:50I1STOfbY1ycR8jGz8DaMeLCdXiI6aDteEdRNNzpdk=
|
||||
github.com/go-openapi/jsonreference v0.21.0 h1:Rs+Y7hSXT83Jacb7kFyjn4ijOuVGSvOdF2+tg1TRrwQ=
|
||||
github.com/go-openapi/jsonreference v0.21.0/go.mod h1:LmZmgsrTkVg9LG4EaHeY8cBDslNPMo06cago5JNLkm4=
|
||||
github.com/go-openapi/spec v0.21.0 h1:LTVzPc3p/RzRnkQqLRndbAzjY0d0BCL72A6j3CdL9ZY=
|
||||
github.com/go-openapi/spec v0.21.0/go.mod h1:78u6VdPw81XU44qEWGhtr982gJ5BWg2c0I5XwVMotYk=
|
||||
github.com/go-openapi/swag v0.23.0 h1:vsEVJDUo2hPJ2tu0/Xc+4noaxyEffXNIs3cOULZ+GrE=
|
||||
github.com/go-openapi/swag v0.23.0/go.mod h1:esZ8ITTYEsH1V2trKHjAN8Ai7xHb8RV+YSZ577vPjgQ=
|
||||
github.com/go-openapi/swag v0.23.1 h1:lpsStH0n2ittzTnbaSloVZLuB5+fvSY/+hnagBjSNZU=
|
||||
github.com/go-openapi/swag v0.23.1/go.mod h1:STZs8TbRvEQQKUA+JZNAm3EWlgaOBGpyFDqQnDHMef0=
|
||||
github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=
|
||||
github.com/go-task/slim-sprig/v3 v3.0.0 h1:sUs3vkvUymDpBKi3qH1YSqBQk9+9D/8M2mN1vB6EwHI=
|
||||
github.com/go-task/slim-sprig/v3 v3.0.0/go.mod h1:W848ghGpv3Qj3dhTPRyJypKRiqCdHZiAzKg9hl15HA8=
|
||||
github.com/gobwas/glob v0.2.3 h1:A4xDbljILXROh+kObIiy5kIaPYD8e96x1tgBhUI5J+Y=
|
||||
github.com/gobwas/glob v0.2.3/go.mod h1:d3Ez4x06l9bZtSvzIay5+Yzi0fmZzPgnTbPcKjJAkT8=
|
||||
github.com/gocolly/colly v1.2.0 h1:qRz9YAn8FIH0qzgNUw+HT9UN7wm1oF9OBAilwEWpyrI=
|
||||
github.com/gocolly/colly v1.2.0/go.mod h1:Hof5T3ZswNVsOHYmba1u03W65HDWgpV5HifSuueE0EA=
|
||||
github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA=
|
||||
github.com/gofiber/fiber/v2 v2.43.0/go.mod h1:mpS1ZNE5jU+u+BA4FbM+KKnUzJ4wzTK+FT2tG3tU+6I=
|
||||
github.com/gofiber/fiber/v2 v2.52.4 h1:P+T+4iK7VaqUsq2PALYEfBBo6bJZ4q3FP8cZ84EggTM=
|
||||
github.com/gofiber/fiber/v2 v2.52.4/go.mod h1:KEOE+cXMhXG0zHc9d8+E38hoX+ZN7bhOtgeF2oT6jrQ=
|
||||
github.com/gofiber/swagger v1.0.0 h1:BzUzDS9ZT6fDUa692kxmfOjc1DZiloLiPK/W5z1H1tc=
|
||||
github.com/gofiber/swagger v1.0.0/go.mod h1:QrYNF1Yrc7ggGK6ATsJ6yfH/8Zi5bu9lA7wB8TmCecg=
|
||||
github.com/gofiber/fiber/v2 v2.52.6 h1:Rfp+ILPiYSvvVuIPvxrBns+HJp8qGLDnLJawAu27XVI=
|
||||
github.com/gofiber/fiber/v2 v2.52.6/go.mod h1:YEcBbO/FB+5M1IZNBP9FO3J9281zgPAreiI1oqg8nDw=
|
||||
github.com/gofiber/swagger v1.1.1 h1:FZVhVQQ9s1ZKLHL/O0loLh49bYB5l1HEAgxDlcTtkRA=
|
||||
github.com/gofiber/swagger v1.1.1/go.mod h1:vtvY/sQAMc/lGTUCg0lqmBL7Ht9O7uzChpbvJeJQINw=
|
||||
github.com/gofiber/template v1.8.0 h1:jOn9RhxYO7rHTHGLNRpYfDoVm8b5GH/dtl15ZT5NifE=
|
||||
github.com/gofiber/template v1.8.0/go.mod h1:jf2w+ioGUS5swf5C/VK+FyE+DI19uz+vXHCX/TIAxIk=
|
||||
github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=
|
||||
@@ -180,8 +187,9 @@ github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfU
|
||||
github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
|
||||
github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
|
||||
github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
|
||||
github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE=
|
||||
github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
|
||||
github.com/golang/groupcache v0.0.0-20241129210726-2c02b8208cf8 h1:f+oWsMOmNPc8JmEHVZIycC7hBoQxHH9pNKQORJNozsQ=
|
||||
github.com/golang/groupcache v0.0.0-20241129210726-2c02b8208cf8/go.mod h1:wcDNUvekVysuuOpQKo3191zZyTpiI6se1N1ULghS0sw=
|
||||
github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
|
||||
github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
|
||||
github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y=
|
||||
@@ -225,8 +233,9 @@ github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/
|
||||
github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
|
||||
github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
|
||||
github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
|
||||
github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=
|
||||
github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
|
||||
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/go-querystring v1.1.0 h1:AnCroh3fv4ZBgVIf1Iwtovgjaw/GiKJo8M8yD/fhyJ8=
|
||||
github.com/google/go-querystring v1.1.0/go.mod h1:Kcdr2DB4koayq7X8pmAG4sNG59So17icRSOU623lUBU=
|
||||
github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
|
||||
@@ -250,6 +259,8 @@ github.com/google/pprof v0.0.0-20210226084205-cbba55b83ad5/go.mod h1:kpwsk12EmLe
|
||||
github.com/google/pprof v0.0.0-20210601050228-01bbb1931b22/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
|
||||
github.com/google/pprof v0.0.0-20210609004039-a478d1d731e9/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
|
||||
github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
|
||||
github.com/google/pprof v0.0.0-20250403155104-27863c87afa6 h1:BHT72Gu3keYf3ZEu2J0b1vyeLSOYI8bm5wbJM/8yDe8=
|
||||
github.com/google/pprof v0.0.0-20250403155104-27863c87afa6/go.mod h1:boTsfXsheKC2y+lKOCMpSfarhxDeIzfZG1jqGcPl3cA=
|
||||
github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=
|
||||
github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
|
||||
github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
|
||||
@@ -263,6 +274,8 @@ github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFb
|
||||
github.com/hashicorp/consul/api v1.11.0/go.mod h1:XjsvQN+RJGWI2TWy1/kqaE16HrR2J/FWgkYjdZQsX9M=
|
||||
github.com/hashicorp/consul/sdk v0.8.0/go.mod h1:GBvyrGALthsZObzUGsfgHZQDXjg4lOjagTIwIR1vPms=
|
||||
github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=
|
||||
github.com/hashicorp/errwrap v1.1.0 h1:OxrOeh75EUXMY8TBjag2fzXGZ40LB6IKw45YeGUDY2I=
|
||||
github.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=
|
||||
github.com/hashicorp/go-cleanhttp v0.5.0/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80=
|
||||
github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80=
|
||||
github.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48=
|
||||
@@ -273,6 +286,8 @@ github.com/hashicorp/go-immutable-radix v1.3.1/go.mod h1:0y9vanUI8NX6FsYoO3zeMjh
|
||||
github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM=
|
||||
github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk=
|
||||
github.com/hashicorp/go-multierror v1.1.0/go.mod h1:spPvp8C1qA32ftKqdAHm4hHTbPw+vmowP0z+KUhOZdA=
|
||||
github.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo=
|
||||
github.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM=
|
||||
github.com/hashicorp/go-retryablehttp v0.5.3/go.mod h1:9B5zBasrRhHXnJnui7y6sL7es7NDiJgTc6Er0maI1Xs=
|
||||
github.com/hashicorp/go-rootcerts v1.0.2/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8=
|
||||
github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU=
|
||||
@@ -293,6 +308,8 @@ github.com/hashicorp/serf v0.9.6/go.mod h1:TXZNMjZQijwlDvp+r0b63xZ45H7JmCmgg4gpT
|
||||
github.com/iancoleman/strcase v0.2.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho=
|
||||
github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc=
|
||||
github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc=
|
||||
github.com/imroc/req/v3 v3.50.0 h1:n3BVnZiTRpvkN5T1IB79LC/THhFU9iXksNRMH4ZNVaY=
|
||||
github.com/imroc/req/v3 v3.50.0/go.mod h1:tsOk8K7zI6cU4xu/VWCZVtq9Djw9IWm4MslKzme5woU=
|
||||
github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8=
|
||||
github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8=
|
||||
github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw=
|
||||
@@ -312,8 +329,8 @@ github.com/kennygrant/sanitize v1.2.4/go.mod h1:LGsjYYtgxbetdg5owWB2mpgUL6e2nfw2
|
||||
github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8=
|
||||
github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
|
||||
github.com/klauspost/compress v1.16.3/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE=
|
||||
github.com/klauspost/compress v1.17.8 h1:YcnTYrq7MikUT7k0Yb5eceMmALQPYBW/Xltxn0NAMnU=
|
||||
github.com/klauspost/compress v1.17.8/go.mod h1:Di0epgTjJY877eYKx5yC51cX2A2Vl2ibi7bDH9ttBbw=
|
||||
github.com/klauspost/compress v1.18.0 h1:c/Cqfb0r+Yi+JtIEq73FWXVkRonBlf0CRNYc8Zttxdo=
|
||||
github.com/klauspost/compress v1.18.0/go.mod h1:2Pp+KzxcywXVXMr50+X0Q/Lsb43OQHYWRCY2AiWywWQ=
|
||||
github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
|
||||
github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg=
|
||||
github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc=
|
||||
@@ -333,15 +350,16 @@ github.com/lucasb-eyer/go-colorful v1.2.0 h1:1nnpGOrhyZZuNyfu1QjKiUICQ74+3FNCN69
|
||||
github.com/lucasb-eyer/go-colorful v1.2.0/go.mod h1:R4dSotOR9KMtayYi1e77YzuveK+i7ruzyGqttikkLy0=
|
||||
github.com/lyft/protoc-gen-star v0.5.3/go.mod h1:V0xaHgaf5oCCqmcxYcWiDfTiKsZsRc87/1qhoTACD8w=
|
||||
github.com/magiconair/properties v1.8.5/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60=
|
||||
github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0=
|
||||
github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc=
|
||||
github.com/mailru/easyjson v0.9.0 h1:PrnmzHw7262yW8sTBwxi1PdJA3Iw/EKBa8psRf7d9a4=
|
||||
github.com/mailru/easyjson v0.9.0/go.mod h1:1+xMtQp2MRNVL/V1bOzuP3aP8VNwRW55fQUto+XFtTU=
|
||||
github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU=
|
||||
github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE=
|
||||
github.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=
|
||||
github.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=
|
||||
github.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4=
|
||||
github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA=
|
||||
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.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=
|
||||
github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s=
|
||||
github.com/mattn/go-isatty v0.0.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcMEpPG5Rm84=
|
||||
@@ -354,8 +372,9 @@ github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWE
|
||||
github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=
|
||||
github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI=
|
||||
github.com/mattn/go-runewidth v0.0.14/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w=
|
||||
github.com/mattn/go-runewidth v0.0.15 h1:UNAjwbU9l54TA3KzvqLGxwWjHmMgBUVhBiTjelZgg3U=
|
||||
github.com/mattn/go-runewidth v0.0.15/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w=
|
||||
github.com/mattn/go-runewidth v0.0.16 h1:E5ScNMtiwvlvB5paMFdw9p4kSQzbXFikJ5SQO6TULQc=
|
||||
github.com/mattn/go-runewidth v0.0.16/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w=
|
||||
github.com/mattn/go-slim v0.0.4/go.mod h1:kXIwPrQbAZrhungtweoDO6qQQpUem6XkBg/mXykpoO0=
|
||||
github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=
|
||||
github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg=
|
||||
@@ -376,6 +395,10 @@ github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRW
|
||||
github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno=
|
||||
github.com/nsf/termbox-go v1.1.1 h1:nksUPLCb73Q++DwbYUBEglYBRPZyoXJdrj5L+TkjyZY=
|
||||
github.com/nsf/termbox-go v1.1.1/go.mod h1:T0cTdVuOwf7pHQNtfhnEbzHbcNyCEcVU4YPpouCbVxo=
|
||||
github.com/onsi/ginkgo/v2 v2.23.4 h1:ktYTpKJAVZnDT4VjxSbiBenUjmlL/5QkBEocaWXiQus=
|
||||
github.com/onsi/ginkgo/v2 v2.23.4/go.mod h1:Bt66ApGPBFzHyR+JO10Zbt0Gsp4uWxu5mIOTusL46e8=
|
||||
github.com/onsi/gomega v1.36.3 h1:hID7cr8t3Wp26+cYnfcjR6HpJ00fdogN6dqZ1t6IylU=
|
||||
github.com/onsi/gomega v1.36.3/go.mod h1:8D9+Txp43QWKhM24yyOBEdpkzN8FvJyAwecBgsU4KU0=
|
||||
github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=
|
||||
github.com/pascaldekloe/goe v0.1.0/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=
|
||||
github.com/pelletier/go-toml v1.9.4/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c=
|
||||
@@ -390,6 +413,8 @@ github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZb
|
||||
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
||||
github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI=
|
||||
github.com/posener/complete v1.2.3/go.mod h1:WZIdtGGp+qx0sLrYKtIRAruyNpv6hFCicSgv7Sy7s/s=
|
||||
github.com/prashantv/gostub v1.1.0 h1:BTyx3RfQjRHnUWaGF9oQos79AlQ5k8WNktv7VGvVH4g=
|
||||
github.com/prashantv/gostub v1.1.0/go.mod h1:A5zLQHz7ieHGG7is6LLXLz7I8+3LZzsrV0P1IAHhP5U=
|
||||
github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw=
|
||||
github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo=
|
||||
github.com/prometheus/client_golang v1.4.0/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU=
|
||||
@@ -402,6 +427,12 @@ github.com/prometheus/common v0.9.1/go.mod h1:yhUN8i9wzaXS3w1O07YhxHEBxD+W35wd8b
|
||||
github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=
|
||||
github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=
|
||||
github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A=
|
||||
github.com/quic-go/qpack v0.5.1 h1:giqksBPnT/HDtZ6VhtFKgoLOWmlyo9Ei6u9PqzIMbhI=
|
||||
github.com/quic-go/qpack v0.5.1/go.mod h1:+PC4XFrEskIVkcLzpEkbLqq1uCoxPhQuvK5rH1ZgaEg=
|
||||
github.com/quic-go/quic-go v0.50.1 h1:unsgjFIUqW8a2oopkY7YNONpV1gYND6Nt9hnt1PN94Q=
|
||||
github.com/quic-go/quic-go v0.50.1/go.mod h1:Vim6OmUvlYdwBhXP9ZVrtGmCMWa3wEqhq3NgYrI8b4E=
|
||||
github.com/refraction-networking/utls v1.6.7 h1:zVJ7sP1dJx/WtVuITug3qYUq034cDq9B2MR1K67ULZM=
|
||||
github.com/refraction-networking/utls v1.6.7/go.mod h1:BC3O4vQzye5hqpmDTWUqi4P5DDhzJfkV1tdqtawQIH0=
|
||||
github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc=
|
||||
github.com/rivo/uniseg v0.4.3/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88=
|
||||
github.com/rivo/uniseg v0.4.7 h1:WUdvkW8uEhrYfLC4ZzdpI2ztxP1I582+49Oc5Mq64VQ=
|
||||
@@ -426,11 +457,12 @@ github.com/spf13/afero v1.3.3/go.mod h1:5KUK8ByomD5Ti5Artl0RtHeI5pTF7MIDuXL3yY52
|
||||
github.com/spf13/afero v1.6.0/go.mod h1:Ai8FlHk4v/PARR026UzYexafAt9roJ7LcLMAmO6Z93I=
|
||||
github.com/spf13/cast v1.4.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE=
|
||||
github.com/spf13/cobra v1.3.0/go.mod h1:BrRVncBjOJa/eUcVVm9CE+oC6as8k+VYr4NY7WCi9V4=
|
||||
github.com/spf13/cobra v1.8.0 h1:7aJaZx1B85qltLMc546zn58BxxfZdR/W22ej9CFoEf0=
|
||||
github.com/spf13/cobra v1.8.0/go.mod h1:WXLWApfZ71AjXPya3WOlMsY9yMs7YeiHhFVlvLyhcho=
|
||||
github.com/spf13/cobra v1.9.1 h1:CXSaggrXdbHK9CF+8ywj8Amf7PBRmPCOJugH954Nnlo=
|
||||
github.com/spf13/cobra v1.9.1/go.mod h1:nDyEzZ8ogv936Cinf6g1RU9MRY64Ir93oCnqb9wxYW0=
|
||||
github.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0EXowPYD95IqWIGo=
|
||||
github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA=
|
||||
github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
|
||||
github.com/spf13/pflag v1.0.6 h1:jFzHGLGAlb3ruxLB8MhbI6A8+AQX/2eW4qeyNZXNp2o=
|
||||
github.com/spf13/pflag v1.0.6/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
|
||||
github.com/spf13/viper v1.10.0/go.mod h1:SoyBPwAtKDzypXNDFKN5kzH7ppppbGZtls1UpIy5AsM=
|
||||
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
|
||||
github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
|
||||
@@ -440,17 +472,17 @@ github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81P
|
||||
github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=
|
||||
github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
|
||||
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
|
||||
github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg=
|
||||
github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
|
||||
github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA=
|
||||
github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
|
||||
github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw=
|
||||
github.com/swaggo/files/v2 v2.0.0 h1:hmAt8Dkynw7Ssz46F6pn8ok6YmGZqHSVLZ+HQM7i0kw=
|
||||
github.com/swaggo/files/v2 v2.0.0/go.mod h1:24kk2Y9NYEJ5lHuCra6iVwkMjIekMCaFq/0JQj66kyM=
|
||||
github.com/swaggo/swag v1.16.3 h1:PnCYjPCah8FK4I26l2F/KQ4yz3sILcVUN3cTlBFA9Pg=
|
||||
github.com/swaggo/swag v1.16.3/go.mod h1:DImHIuOFXKpMFAQjcC7FG4m3Dg4+QuUgUzJmKjI/gRk=
|
||||
github.com/swaggo/files/v2 v2.0.2 h1:Bq4tgS/yxLB/3nwOMcul5oLEUKa877Ykgz3CJMVbQKU=
|
||||
github.com/swaggo/files/v2 v2.0.2/go.mod h1:TVqetIzZsO9OhHX1Am9sRf9LdrFZqoK49N37KON/jr0=
|
||||
github.com/swaggo/swag v1.16.4 h1:clWJtd9LStiG3VeijiCfOVODP6VpHtKdQy9ELFG3s1A=
|
||||
github.com/swaggo/swag v1.16.4/go.mod h1:VBsHJRsDvfYvqoiMKnsdwhNV9LEMHgEDZcyVYX0sxPg=
|
||||
github.com/temoto/robotstxt v1.1.2 h1:W2pOjSJ6SWvldyEuiFXNxz3xZ8aiWX5LbfDiOFd7Fxg=
|
||||
github.com/temoto/robotstxt v1.1.2/go.mod h1:+1AmkuG3IYkh1kv0d2qEB9Le88ehNO0zwOr3ujewlOo=
|
||||
github.com/tidwall/gjson v1.17.1 h1:wlYEnwqAHgzmhNUFfw7Xalt2JzQvsMx2Se4PcoFCT/U=
|
||||
github.com/tidwall/gjson v1.17.1/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=
|
||||
github.com/tidwall/gjson v1.18.0 h1:FIDeeyB800efLX89e5a8Y0BNH+LOngJyGrIWxG2FKQY=
|
||||
github.com/tidwall/gjson v1.18.0/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=
|
||||
github.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA=
|
||||
github.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM=
|
||||
github.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU=
|
||||
@@ -462,10 +494,11 @@ github.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqri
|
||||
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.45.0/go.mod h1:k2zXd82h/7UZc3VOdJ2WaUqt1uZ/XpXAfE9i+HBC3lA=
|
||||
github.com/valyala/fasthttp v1.54.0 h1:cCL+ZZR3z3HPLMVfEYVUMtJqVaui0+gu7Lx63unHwS0=
|
||||
github.com/valyala/fasthttp v1.54.0/go.mod h1:6dt4/8olwq9QARP/TDuPmWyWcl4byhpvTJ4AAtcz+QM=
|
||||
github.com/valyala/tcplisten v1.0.0 h1:rBHj/Xf+E1tRGZyWIWwJDiRY0zc1Js+CV5DqwacVSA8=
|
||||
github.com/valyala/fasthttp v1.60.0 h1:kBRYS0lOhVJ6V+bYN8PqAHELKHtXqwq9zNMLKx1MBsw=
|
||||
github.com/valyala/fasthttp v1.60.0/go.mod h1:iY4kDgV3Gc6EqhRZ8icqcmlG6bqhcDXfuHgTO4FXCvc=
|
||||
github.com/valyala/tcplisten v1.0.0/go.mod h1:T0xQ8SeCZGxckz9qRXTfG43PvQ/mcWh7FwZEA7Ioqkc=
|
||||
github.com/xyproto/randomstring v1.0.5 h1:YtlWPoRdgMu3NZtP45drfy1GKoojuR7hmRcnhZqKjWU=
|
||||
github.com/xyproto/randomstring v1.0.5/go.mod h1:rgmS5DeNXLivK7YprL0pY+lTuhNQW3iGxZ18UQApw/E=
|
||||
github.com/yosssi/ace v0.0.5/go.mod h1:ALfIzm2vT7t5ZE7uoIZqF3TQ7SAOyupFZnkrF5id+K0=
|
||||
github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
|
||||
github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
|
||||
@@ -486,6 +519,10 @@ go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk=
|
||||
go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E=
|
||||
go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI=
|
||||
go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc=
|
||||
go.uber.org/automaxprocs v1.6.0 h1:O3y2/QNTOdbF+e/dpXNNW7Rx2hZ4sTIPyybbxyNqTUs=
|
||||
go.uber.org/automaxprocs v1.6.0/go.mod h1:ifeIMSnPZuznNm6jmdzmU3/bfk01Fe2fotchwEFJ8r8=
|
||||
go.uber.org/mock v0.5.1 h1:ASgazW/qBmR+A32MYFDB6E2POoTgOwT509VP0CT/fjs=
|
||||
go.uber.org/mock v0.5.1/go.mod h1:ge71pBPLYDk7QIi1LupWxdAykm7KIEFchiOqd6z7qMM=
|
||||
go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU=
|
||||
go.uber.org/zap v1.17.0/go.mod h1:MXVU+bhUf/A7Xi2HNOnopQOrmycQ5Ih87HtOu4q5SSo=
|
||||
golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
|
||||
@@ -500,6 +537,12 @@ golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPh
|
||||
golang.org/x/crypto v0.0.0-20210817164053-32db794688a5/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
|
||||
golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
|
||||
golang.org/x/crypto v0.7.0/go.mod h1:pYwdfH91IfpZVANVyUOhSIPZaFoJGxTFbZhFTx+dXZU=
|
||||
golang.org/x/crypto v0.13.0/go.mod h1:y6Z2r+Rw4iayiXXAIxJIDAJ1zMW4yaTpebo8fPOliYc=
|
||||
golang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU=
|
||||
golang.org/x/crypto v0.23.0/go.mod h1:CKFgDieR+mRhux2Lsu27y0fO304Db0wZe70UKqHu0v8=
|
||||
golang.org/x/crypto v0.31.0/go.mod h1:kDsLvtWBEx7MV9tJOj9bnXsPbxwJQ6csT/x4KIN4Ssk=
|
||||
golang.org/x/crypto v0.37.0 h1:kJNSjF/Xp7kU0iB2Z+9viTPMW4EqqsrywMXLJOOsXSE=
|
||||
golang.org/x/crypto v0.37.0/go.mod h1:vg+k43peMZ0pUMhYmVAWysMK35e6ioLh3wB8ZCAfbVc=
|
||||
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
|
||||
golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
|
||||
golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8=
|
||||
@@ -510,6 +553,8 @@ golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u0
|
||||
golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=
|
||||
golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM=
|
||||
golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU=
|
||||
golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0 h1:R84qjqJb5nVJMxqWYb3np9L5ZsaDtB+a39EqjV0JSUM=
|
||||
golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0/go.mod h1:S9Xr4PYopiDyqSyp5NjCrhFrqg6A5zA2E/iPHPhqnS8=
|
||||
golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=
|
||||
golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
|
||||
golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
|
||||
@@ -540,8 +585,11 @@ golang.org/x/mod v0.5.1/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro=
|
||||
golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=
|
||||
golang.org/x/mod v0.7.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
|
||||
golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
|
||||
golang.org/x/mod v0.17.0 h1:zY54UmvipHiNd+pm+m0x9KhZ9hl1/7QNMyxXbc6ICqA=
|
||||
golang.org/x/mod v0.12.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
|
||||
golang.org/x/mod v0.15.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c=
|
||||
golang.org/x/mod v0.17.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c=
|
||||
golang.org/x/mod v0.24.0 h1:ZfthKaKaT4NrhGVZHO1/WDTwGES4De8KtWO0SIbNJMU=
|
||||
golang.org/x/mod v0.24.0/go.mod h1:IXM97Txy2VM4PJ3gI61r1YEk/gAj6zAHN3AdZt6S9Ww=
|
||||
golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||
golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||
golang.org/x/net v0.0.0-20181023162649-9b4f9f5ad519/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||
@@ -588,11 +636,14 @@ golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qx
|
||||
golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
|
||||
golang.org/x/net v0.3.0/go.mod h1:MBQ8lrhLObU/6UmLb4fmbmk5OcyYmqtbGd/9yIeKjEE=
|
||||
golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=
|
||||
golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=
|
||||
golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc=
|
||||
golang.org/x/net v0.9.0/go.mod h1:d48xBJpPfHeWQsugry2m+kC02ZBRGRgulfHnEXEuWns=
|
||||
golang.org/x/net v0.25.0 h1:d/OCCoBEUq33pjydKrGQhw7IlUPI2Oylr+8qLx49kac=
|
||||
golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg=
|
||||
golang.org/x/net v0.15.0/go.mod h1:idbUs1IY1+zTqbi8yxTbhexhEEk5ur9LInksu6HrEpk=
|
||||
golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44=
|
||||
golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM=
|
||||
golang.org/x/net v0.33.0/go.mod h1:HXLR5J+9DxmrqMwG9qjGCxZ+zKXxBru04zlTvWlWuN4=
|
||||
golang.org/x/net v0.39.0 h1:ZCu7HMWDxpXpaiKdhzIfaltL9Lp31x/3fCP11bc6/fY=
|
||||
golang.org/x/net v0.39.0/go.mod h1:X7NRbYVEA+ewNkCNyJ513WmMdQ3BineSwVtN2zD/d+E=
|
||||
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
|
||||
golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
|
||||
golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
|
||||
@@ -623,8 +674,12 @@ golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJ
|
||||
golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/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.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||
golang.org/x/sync v0.7.0 h1:YsImfSBoP9QPYL0xyKJPq0gcaJdG3rInoqxTWbfQu9M=
|
||||
golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y=
|
||||
golang.org/x/sync v0.6.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
|
||||
golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
|
||||
golang.org/x/sync v0.10.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
|
||||
golang.org/x/sync v0.13.0 h1:AauUjRAJ9OSnvULf/ARrrVywoJDy0YS2AwQ98I37610=
|
||||
golang.org/x/sync v0.13.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA=
|
||||
golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||
golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||
golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||
@@ -697,19 +752,28 @@ golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBc
|
||||
golang.org/x/sys v0.3.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.7.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
|
||||
golang.org/x/sys v0.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y=
|
||||
golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
|
||||
golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
|
||||
golang.org/x/sys v0.29.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
|
||||
golang.org/x/sys v0.32.0 h1:s77OFDvIQeibCmezSnk/q6iAfkdiQaJi4VzroCFrN20=
|
||||
golang.org/x/sys v0.32.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=
|
||||
golang.org/x/telemetry v0.0.0-20240228155512-f48c80bd79b2/go.mod h1:TeRTkGYfJXctD9OcfyVLyj2J3IxLnKwHJR8f4D8a3YE=
|
||||
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.3.0/go.mod h1:q750SLmJuPmVoN1blW3UFBPREJfb1KmY3vwxfr+nFDA=
|
||||
golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k=
|
||||
golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U=
|
||||
golang.org/x/term v0.7.0/go.mod h1:P32HKFT3hSsZrRxla30E9HqToFYAQPCMs/zFMBUFqPY=
|
||||
golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo=
|
||||
golang.org/x/term v0.12.0/go.mod h1:owVbMEjm3cBLCHdkQu9b1opXd4ETQWc3BhuQGKgXgvU=
|
||||
golang.org/x/term v0.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk=
|
||||
golang.org/x/term v0.20.0 h1:VnkxpohqXaOBYJtBmEppKUG6mXpi+4O6purfc2+sMhw=
|
||||
golang.org/x/term v0.20.0/go.mod h1:8UkIAJTvZgivsXaD6/pH6U9ecQzZ45awqEOzuCvwpFY=
|
||||
golang.org/x/term v0.27.0/go.mod h1:iMsnZpn0cago0GOrHO2+Y7u7JPn5AylBrcoWkElMTSM=
|
||||
golang.org/x/term v0.28.0/go.mod h1:Sw/lC2IAUZ92udQNf3WodGtn4k/XoLyZoh8v/8uiwek=
|
||||
golang.org/x/term v0.31.0 h1:erwDkOK1Msy6offm1mOgvspSkslFnIGsFnxOKoufg3o=
|
||||
golang.org/x/term v0.31.0/go.mod h1:R4BeIy7D95HzImkxGkTW1UQTtP54tio2RyHz7PwK0aw=
|
||||
golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
||||
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
||||
golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
||||
@@ -724,12 +788,17 @@ golang.org/x/text v0.5.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
|
||||
golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
|
||||
golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=
|
||||
golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=
|
||||
golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE=
|
||||
golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=
|
||||
golang.org/x/text v0.15.0 h1:h1V/4gjBv8v9cjcR6+AR5+/cIYK5N/WAgiv4xlsEtAk=
|
||||
golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=
|
||||
golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ=
|
||||
golang.org/x/text v0.24.0 h1:dd5Bzh4yt5KYA8f9CJHCP4FB4D51c2c6JvN37xJJkJ0=
|
||||
golang.org/x/text v0.24.0/go.mod h1:L8rBsPeo2pSS+xqN0d5u2ikmjtmoJbDBT1b7nHvFCdU=
|
||||
golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
|
||||
golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
|
||||
golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
|
||||
golang.org/x/time v0.5.0 h1:o7cqy6amK/52YcAKIPlM3a+Fpj35zvRj2TP+e1xFSfk=
|
||||
golang.org/x/time v0.5.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM=
|
||||
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
||||
golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
||||
golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=
|
||||
@@ -789,8 +858,10 @@ golang.org/x/tools v0.1.9/go.mod h1:nABZi5QlRsZVlzPpHl034qft6wpY4eDcsTt5AaioBiU=
|
||||
golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=
|
||||
golang.org/x/tools v0.4.0/go.mod h1:UE5sM2OK9E/d67R0ANs2xJizIymRP5gJU295PvKXxjQ=
|
||||
golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU=
|
||||
golang.org/x/tools v0.21.0 h1:qc0xYgIbsSDt9EyWz05J5wfa7LOVW0YTLOXrqdLAWIw=
|
||||
golang.org/x/tools v0.21.0/go.mod h1:aiJjzUbINMkxbQROHiO6hDPo2LHcIPhhQsa9DLh0yGk=
|
||||
golang.org/x/tools v0.13.0/go.mod h1:HvlwmtVNQAhOuCjW7xxvovg8wbNq7LwfXh/k7wXUl58=
|
||||
golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d/go.mod h1:aiJjzUbINMkxbQROHiO6hDPo2LHcIPhhQsa9DLh0yGk=
|
||||
golang.org/x/tools v0.32.0 h1:Q7N1vhpkQv7ybVzLFtTjvQya2ewbwNDZzUgfXGqtMWU=
|
||||
golang.org/x/tools v0.32.0/go.mod h1:ZxrU41P/wAbZD8EDa6dDCa6XfpkhJ7HFMjHJXfBDu8s=
|
||||
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||
@@ -940,8 +1011,8 @@ google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlba
|
||||
google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=
|
||||
google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
|
||||
google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
|
||||
google.golang.org/protobuf v1.34.1 h1:9ddQBjfCyZPOHPUiPxpYESBLc+T8P3E+Vo4IbKZgFWg=
|
||||
google.golang.org/protobuf v1.34.1/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos=
|
||||
google.golang.org/protobuf v1.36.6 h1:z1NpPI8ku2WgiWnf+t9wTPsn6eP1L7ksHUlkfLvd9xY=
|
||||
google.golang.org/protobuf v1.36.6/go.mod h1:jduwjTPXsFjZGTmRluh+L6NjiWu7pchiJ2/5YcXBHnY=
|
||||
gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw=
|
||||
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||
|
@@ -5,12 +5,6 @@
|
||||
"cloudflare": false,
|
||||
"host": "Airtel"
|
||||
},
|
||||
{
|
||||
"country": "Canada",
|
||||
"link": "https://translate.bus-hit.me",
|
||||
"cloudflare": false,
|
||||
"host": "Oracle"
|
||||
},
|
||||
{
|
||||
"country": "USA",
|
||||
"link": "https://nyc1.mz.ggtyler.dev",
|
||||
@@ -37,8 +31,62 @@
|
||||
},
|
||||
{
|
||||
"country": "Germany",
|
||||
"link": "http://42i2bzogwkph3dvoo2bm6srskf7vvabsphw7uzftymbjjlzgfluhnmid.onion",
|
||||
"link": "https://mozhi.pussthecat.org",
|
||||
"cloudflare": false,
|
||||
"host": "Hetzner"
|
||||
},
|
||||
{
|
||||
"country": "Germany",
|
||||
"link": "https://mozhi.adminforge.de",
|
||||
"cloudflare": false,
|
||||
"host": "Hetzner"
|
||||
},
|
||||
{
|
||||
"country": "Finland",
|
||||
"link": "https://translate.privacyredirect.com",
|
||||
"cloudflare": false,
|
||||
"host": "Private WebHost"
|
||||
},
|
||||
{
|
||||
"country": "USA",
|
||||
"link": "https://mozhi.canine.tools",
|
||||
"cloudflare": false,
|
||||
"host": "RoyaleHosting"
|
||||
},
|
||||
{
|
||||
"country": "Russia",
|
||||
"link": "https://mzh.dc09.ru",
|
||||
"cloudflare": false,
|
||||
"host": "TimeWeb Cloud"
|
||||
},
|
||||
{
|
||||
"country": "Germany",
|
||||
"link": "https://mozhi.franklyflawless.org",
|
||||
"cloudflare": false,
|
||||
"host": "Hetzner"
|
||||
},
|
||||
{
|
||||
"country": "USA",
|
||||
"onion": "http://mozhi.wsuno6lnjdcsiok5mrxvl6e2bdex7nhsqqav6ux7tkwrqiqnulejfbyd.onion",
|
||||
"cloudflare": false,
|
||||
"host": "Hetzner"
|
||||
},
|
||||
{
|
||||
"country": "Germany",
|
||||
"onion": "http://42i2bzogwkph3dvoo2bm6srskf7vvabsphw7uzftymbjjlzgfluhnmid.onion",
|
||||
"cloudflare": false,
|
||||
"host": "Datalix"
|
||||
},
|
||||
{
|
||||
"country": "Germany",
|
||||
"onion": "http://3mu2almmcv7rd7wlwhmkbwqgttntgpqu3hdanutxbv2v72wzbxe5ixqd.onion",
|
||||
"cloudflare": false,
|
||||
"host": "pawhost.de"
|
||||
},
|
||||
{
|
||||
"country": "Germany",
|
||||
"i2p": "http://74lptlnvaukcjnmqefedgna35ahkqexqzq2qq3k7utc2ep4jotcq.b32.i2p",
|
||||
"cloudflare": false,
|
||||
"host": "pawhost.de"
|
||||
}
|
||||
]
|
||||
]
|
@@ -1,31 +1,62 @@
|
||||
#!/usr/bin/python3
|
||||
import requests
|
||||
import json
|
||||
from bs4 import BeautifulSoup
|
||||
import sys
|
||||
|
||||
from bs4 import BeautifulSoup
|
||||
from urllib3.util import Retry
|
||||
import requests
|
||||
from requests.adapters import HTTPAdapter
|
||||
|
||||
print("Getting HTML")
|
||||
|
||||
headers = {
|
||||
'User-Agent': 'Mozilla/5.0 MozhiInstanceFetcher/1.0 (+codeberg.org/aryak/mozhi)'
|
||||
}
|
||||
|
||||
session = requests.Session()
|
||||
session.headers.update(headers)
|
||||
retries = Retry(total=5,
|
||||
connect=3, # ConnectTimeoutError
|
||||
read=False, # ReadTimeoutError or ProtocolError
|
||||
redirect=False, # obvi, any redirections
|
||||
status=2, # Status codes by server
|
||||
backoff_factor=1,
|
||||
backoff_max=30, # Just to be sure that script don't go sleep for a minute
|
||||
respect_retry_after_header=False)
|
||||
http_adapter = HTTPAdapter(max_retries=retries)
|
||||
session.mount('https://', http_adapter)
|
||||
session.mount('http://', http_adapter)
|
||||
|
||||
|
||||
print("Getting HTML")
|
||||
# Get the HTML from the page
|
||||
r = requests.get('https://codeberg.org/aryak/mozhi', headers=headers)
|
||||
r = session.get('https://codeberg.org/aryak/mozhi/src/branch/master/README.md') # XXX: relied on Codeberg
|
||||
|
||||
# Parse the HTML
|
||||
soup = BeautifulSoup(r.text, 'html.parser')
|
||||
|
||||
print("Scraping started")
|
||||
|
||||
# Get tables
|
||||
tables = soup.find_all('table')
|
||||
|
||||
# Get table with header 'Master Branch'
|
||||
table = tables[1]
|
||||
# Get table after Instances header
|
||||
instances_h2 = soup.find("h2", string="Instances")
|
||||
try:
|
||||
table = instances_h2.find_next_sibling("table")
|
||||
except AttributeError:
|
||||
print("Instances header not found")
|
||||
sys.exit(-1)
|
||||
|
||||
# Get all rows and columns. Skip the first row because it's the header
|
||||
rows = table.find_all('tr')[1:]
|
||||
|
||||
def get_net_type(url: str):
|
||||
url = url.strip("/")
|
||||
if url.endswith(".onion"):
|
||||
return "onion"
|
||||
elif url.endswith(".i2p"):
|
||||
return "i2p"
|
||||
elif url.endswith(".loki"):
|
||||
return "lokinet"
|
||||
return "link"
|
||||
|
||||
theJson = []
|
||||
|
||||
for row in rows:
|
||||
@@ -36,13 +67,13 @@ for row in rows:
|
||||
host = row.find_all('td')[3].text
|
||||
|
||||
print("Scraping " + row.find_all('td')[0].find('a')['href'] + ' instance...')
|
||||
if cloudflare == 'Yes':
|
||||
isCloudflare = True
|
||||
else:
|
||||
isCloudflare = False
|
||||
isCloudflare = cloudflare == "Yes"
|
||||
|
||||
try:
|
||||
r = requests.get(link + '/', headers=headers)
|
||||
if get_net_type(url=link) == "link":
|
||||
r = session.get(link + '/', headers=headers)
|
||||
else:
|
||||
print(f"Non-clearnet mirror [{row.find_all('td')[0].find('a').get_text()}]. Skipping check")
|
||||
if r.status_code != 200:
|
||||
print("Error while fetching " + link + '/. We got a ' + str(r.status_code) + ' status code. Skipping...')
|
||||
continue
|
||||
@@ -52,7 +83,7 @@ for row in rows:
|
||||
|
||||
theJson.append({
|
||||
'country': country,
|
||||
'link': link,
|
||||
get_net_type(url=link): link,
|
||||
'cloudflare': isCloudflare,
|
||||
'host': host,
|
||||
})
|
||||
|
10
pages/api.go
10
pages/api.go
@@ -55,7 +55,7 @@ func HandleTargetLanguages(c *fiber.Ctx) error {
|
||||
// @Router /api/tts [get]
|
||||
func HandleTTS(c *fiber.Ctx) error {
|
||||
engine := utils.Sanitize(c.Query("engine"), "alpha")
|
||||
lang := utils.Sanitize(c.Query("lang"), "alpha")
|
||||
lang := c.Query("lang")
|
||||
text := c.Query("text")
|
||||
if engine == "" || text == "" || lang == "" {
|
||||
return fiber.NewError(fiber.StatusBadRequest, "engine, lang, text are required query strings.")
|
||||
@@ -80,8 +80,8 @@ func HandleTTS(c *fiber.Ctx) error {
|
||||
// @Router /api/translate [get]
|
||||
func HandleTranslate(c *fiber.Ctx) error {
|
||||
engine := utils.Sanitize(utils.GetQueryOrFormValue(c, "engine"), "alpha")
|
||||
from := utils.Sanitize(utils.GetQueryOrFormValue(c, "from"), "alpha")
|
||||
to := utils.Sanitize(utils.GetQueryOrFormValue(c, "to"), "alpha")
|
||||
from := utils.GetQueryOrFormValue(c, "from")
|
||||
to := utils.GetQueryOrFormValue(c, "to")
|
||||
text := utils.GetQueryOrFormValue(c, "text")
|
||||
if engine == "" || from == "" || to == "" || text == "" {
|
||||
return fiber.NewError(fiber.StatusBadRequest, "from, to, engine, text are required query strings.")
|
||||
@@ -117,8 +117,8 @@ func HandleTranslate(c *fiber.Ctx) error {
|
||||
// @Router /api/image [post]
|
||||
func HandleImg(c *fiber.Ctx) error {
|
||||
engine := utils.Sanitize(c.FormValue("engine"), "alpha")
|
||||
from := utils.Sanitize(c.FormValue("from"), "alpha")
|
||||
to := utils.Sanitize(c.FormValue("to"), "alpha")
|
||||
from := c.FormValue("from")
|
||||
to := c.FormValue("to")
|
||||
file, err := c.FormFile("image")
|
||||
if err != nil {
|
||||
return err
|
||||
|
@@ -3,16 +3,17 @@ package pages
|
||||
import (
|
||||
"os"
|
||||
"slices"
|
||||
"strings"
|
||||
|
||||
"codeberg.org/aryak/libmozhi"
|
||||
"codeberg.org/aryak/mozhi/utils"
|
||||
"github.com/gofiber/fiber/v2"
|
||||
)
|
||||
|
||||
func langListMerge(engines map[string]string) ([]libmozhi.List, []libmozhi.List) {
|
||||
func langListMerge(engines []string) ([]libmozhi.List, []libmozhi.List) {
|
||||
sl := []libmozhi.List{}
|
||||
tl := []libmozhi.List{}
|
||||
for key := range engines {
|
||||
for _, key := range engines {
|
||||
temp, _ := libmozhi.LangList(key, "sl")
|
||||
temp2, _ := libmozhi.LangList(key, "tl")
|
||||
sl = append(sl, temp...)
|
||||
@@ -23,6 +24,11 @@ func langListMerge(engines map[string]string) ([]libmozhi.List, []libmozhi.List)
|
||||
|
||||
func HandleIndex(c *fiber.Ctx) error {
|
||||
engines := utils.EngineList()
|
||||
type enginesStruct struct {
|
||||
Engines []string `query:"engines"`
|
||||
}
|
||||
enginesSome := new(enginesStruct)
|
||||
c.QueryParser(enginesSome)
|
||||
var enginesAsArray []string
|
||||
for engine := range engines {
|
||||
enginesAsArray = append(enginesAsArray, engine)
|
||||
@@ -42,7 +48,25 @@ func HandleIndex(c *fiber.Ctx) error {
|
||||
var sourceLanguages []libmozhi.List
|
||||
var targetLanguages []libmozhi.List
|
||||
if engine == "all" {
|
||||
sourceLanguages, targetLanguages = langListMerge(engines)
|
||||
sourceLanguages, targetLanguages = langListMerge(enginesAsArray)
|
||||
} else if engine == "some" {
|
||||
if c.Cookies("engines") == "" && enginesSome.Engines == nil {
|
||||
enginesSome.Engines = append(enginesSome.Engines, "google")
|
||||
} else if enginesSome.Engines == nil && c.Cookies("engines") != "" {
|
||||
enginesSome.Engines = strings.Split(c.Cookies("engines"), ",")
|
||||
}
|
||||
for i, engine := range enginesSome.Engines {
|
||||
if !slices.Contains(enginesAsArray, engine) || engine == "some" {
|
||||
// Delete array from slice if its not in engines list
|
||||
enginesSome.Engines = append(enginesSome.Engines[:i], enginesSome.Engines[i+1:]...)
|
||||
} else if engine == "all" {
|
||||
enginesSome.Engines = enginesAsArray
|
||||
}
|
||||
}
|
||||
if enginesSome.Engines == nil {
|
||||
enginesSome.Engines = append(enginesSome.Engines, "google")
|
||||
}
|
||||
sourceLanguages, targetLanguages = langListMerge(enginesSome.Engines)
|
||||
} else {
|
||||
sourceLanguages, _ = libmozhi.LangList(engine, "sl")
|
||||
targetLanguages, _ = libmozhi.LangList(engine, "tl")
|
||||
@@ -66,13 +90,18 @@ func HandleIndex(c *fiber.Ctx) error {
|
||||
|
||||
var translation libmozhi.LangOut
|
||||
var translationExists bool
|
||||
var transall []libmozhi.LangOut
|
||||
var transmany []libmozhi.LangOut
|
||||
var tlerr error
|
||||
var ttsFrom string
|
||||
var ttsTo string
|
||||
if engine != "" && originalText != "" && from != "" && to != "" {
|
||||
if engine == "all" {
|
||||
transall = libmozhi.TranslateAll(to, from, originalText)
|
||||
transmany = libmozhi.TranslateAll(to, from, originalText)
|
||||
translationExists = true
|
||||
} else if engine == "some" {
|
||||
// The error doesn't really matter since it just checks if the engines are valid, which is already checked in the code at the beginning of the func
|
||||
transmany, _ = libmozhi.TranslateSome(enginesSome.Engines, to, from, originalText)
|
||||
translationExists = true
|
||||
} else {
|
||||
translation, tlerr = libmozhi.Translate(engine, to, from, originalText)
|
||||
if tlerr != nil {
|
||||
@@ -95,7 +124,7 @@ func HandleIndex(c *fiber.Ctx) error {
|
||||
defaultLang := os.Getenv("MOZHI_DEFAULT_SOURCE_LANG")
|
||||
preferAutoDetect := os.Getenv("MOZHI_DEFAULT_PREFER_AUTODETECT")
|
||||
defaultLangTarget := os.Getenv("MOZHI_DEFAULT_TARGET_LANG")
|
||||
if defaultLang == "" || preferAutoDetect == "true" {
|
||||
if defaultLang == "" || (preferAutoDetect == "true" && sourceLanguages[0].Id == "auto") {
|
||||
defaultLang = "auto"
|
||||
}
|
||||
if defaultLangTarget == "" {
|
||||
@@ -117,15 +146,23 @@ func HandleIndex(c *fiber.Ctx) error {
|
||||
cookie.Value = to
|
||||
c.Cookie(cookie)
|
||||
}
|
||||
if enginesSome.Engines != nil {
|
||||
cookie := new(fiber.Cookie)
|
||||
cookie.Name = "engines"
|
||||
cookie.Value = strings.Join(enginesSome.Engines, ",")
|
||||
c.Cookie(cookie)
|
||||
}
|
||||
return c.Render("index", fiber.Map{
|
||||
"Engine": engine,
|
||||
"enginesNames": engines,
|
||||
"SomeEngines": enginesSome.Engines,
|
||||
"SomeEnginesStr": strings.Join(enginesSome.Engines, ","),
|
||||
"SourceLanguages": sourceLanguages,
|
||||
"TargetLanguages": targetLanguages,
|
||||
"OriginalText": originalText,
|
||||
"Translation": translation,
|
||||
"TranslationExists": translationExists,
|
||||
"TranslateAll": transall,
|
||||
"TranslateMany": transmany,
|
||||
"From": from,
|
||||
"To": to,
|
||||
"TtsFrom": ttsFrom,
|
||||
|
BIN
public/assets/FreeSerif.otf
Normal file
BIN
public/assets/FreeSerif.otf
Normal file
Binary file not shown.
BIN
public/assets/NotoSans-Regular.ttf
Normal file
BIN
public/assets/NotoSans-Regular.ttf
Normal file
Binary file not shown.
144
public/assets/mozhi-pathd.svg
Normal file
144
public/assets/mozhi-pathd.svg
Normal file
@@ -0,0 +1,144 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||
|
||||
<svg
|
||||
width="512"
|
||||
height="512"
|
||||
viewBox="0 0 512 512"
|
||||
version="1.1"
|
||||
id="svg1"
|
||||
sodipodi:docname="mozhi-pathd.svg"
|
||||
inkscape:version="1.3.2 (091e20ef0f, 2023-11-25, custom)"
|
||||
inkscape:export-filename="mozhi.png"
|
||||
inkscape:export-xdpi="96"
|
||||
inkscape:export-ydpi="96"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:svg="http://www.w3.org/2000/svg">
|
||||
<sodipodi:namedview
|
||||
id="namedview1"
|
||||
pagecolor="#505050"
|
||||
bordercolor="#eeeeee"
|
||||
borderopacity="1"
|
||||
inkscape:showpageshadow="0"
|
||||
inkscape:pageopacity="0"
|
||||
inkscape:pagecheckerboard="0"
|
||||
inkscape:deskcolor="#d1d1d1"
|
||||
inkscape:document-units="px"
|
||||
inkscape:zoom="1.2084344"
|
||||
inkscape:cx="249.08261"
|
||||
inkscape:cy="285.0796"
|
||||
inkscape:window-width="1916"
|
||||
inkscape:window-height="1052"
|
||||
inkscape:window-x="0"
|
||||
inkscape:window-y="0"
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:current-layer="g11"
|
||||
showgrid="false" />
|
||||
<defs
|
||||
id="defs1">
|
||||
<rect
|
||||
x="447.58857"
|
||||
y="274.24914"
|
||||
width="82.898286"
|
||||
height="70.866286"
|
||||
id="rect6" />
|
||||
<rect
|
||||
x="444.70632"
|
||||
y="249.71617"
|
||||
width="91.789733"
|
||||
height="104.34795"
|
||||
id="rect5" />
|
||||
<rect
|
||||
x="417.77323"
|
||||
y="221.92324"
|
||||
width="75.620828"
|
||||
height="87.946305"
|
||||
id="rect4" />
|
||||
<rect
|
||||
x="31.513527"
|
||||
y="105.19809"
|
||||
width="77.838314"
|
||||
height="113.70924"
|
||||
id="rect3" />
|
||||
<rect
|
||||
x="444.05983"
|
||||
y="63.136958"
|
||||
width="55.320802"
|
||||
height="148.09968"
|
||||
id="rect2" />
|
||||
</defs>
|
||||
<g
|
||||
inkscape:label="Calque 1"
|
||||
inkscape:groupmode="layer"
|
||||
id="layer1">
|
||||
<rect
|
||||
style="display:inline;fill:#f57c00;stroke-width:1.532;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:3.5;stroke-opacity:0.86324;paint-order:stroke fill markers"
|
||||
id="rect1"
|
||||
width="512"
|
||||
height="512"
|
||||
x="0"
|
||||
y="0"
|
||||
ry="0"
|
||||
inkscape:label="Bg color" />
|
||||
<g
|
||||
id="g11"
|
||||
transform="translate(-1.6455033e-8,-8.8717685)">
|
||||
<path
|
||||
d="M 317.96686,288.17101 H 278.15488 V 150.21787 c 0,-28.70166 9.72153,-42.58956 29.62752,-42.58956 39.34905,0 59.25503,32.86803 59.25503,98.14116 0,31.01631 -21.7577,82.40154 -49.07057,82.40154 z m -39.34905,56.94039 c -37.0344,13.8879 -20.83185,74.53173 -92.12307,74.53173 -30.55338,0 -50.45937,-19.90599 -50.45937,-45.36714 0,-12.49911 16.66548,-16.66548 16.66548,-18.05427 0,-2.31465 -6.94395,-8.79567 -20.36892,-8.79567 -13.42497,0 -21.75771,14.35083 -21.75771,31.94217 0,12.49911 13.42497,58.32918 74.53173,58.32918 97.2153,0 83.79033,-81.01275 137.02728,-81.01275 h 32.40509 c 10.64739,0 12.96204,-13.8879 12.96204,-15.73962 0,-2.31465 -2.77758,-3.70344 -9.2586,-3.70344 h -28.70165 c -37.49733,0 -50.45937,-8.79567 -51.38523,-31.01631 h 31.01631 c 16.66548,0 82.40153,-15.27669 82.40153,-117.58422 0,-59.25504 -16.66548,-99.067016 -83.79032,-99.067016 -38.42319,0 -57.86625,21.294776 -57.86625,64.810196 v 133.78677 h -96.75237 c -10.64739,0 -12.96204,-5.55516 -12.96204,-20.36892 V 88.185254 c -5.55516,12.036176 -28.23873,5.09223 -28.23873,23.609426 v 158.32206 c 0,23.1465 5.55516,36.10854 37.0344,36.10854 h 101.38167 c 0,23.1465 6.01809,32.4051 28.23873,38.88612 z"
|
||||
id="text1"
|
||||
style="font-size:462.93px;line-height:0;font-family:FreeSerif;-inkscape-font-specification:FreeSerif;letter-spacing:0.52px;word-spacing:1.62px;white-space:pre;inline-size:304.773;fill:#fbe9e7;stroke-width:3.47197"
|
||||
inkscape:label="Tamil"
|
||||
transform="translate(4.9270244,-6.9413264)"
|
||||
aria-label="ழ" />
|
||||
<path
|
||||
d="m 473.58055,85.211726 q 0,4.44 -1.48,7.76 -1.44,3.28 -4.44,5.12 -3,1.84 -7.68,1.84 -4.64,0 -7.68,-1.84 -3,-1.84 -4.48,-5.16 -1.44,-3.32 -1.44,-7.76 0,-4.44 1.44,-7.72 1.48,-3.28 4.48,-5.08 3.04,-1.84 7.72,-1.84 4.64,0 7.64,1.84 3,1.8 4.44,5.12 1.48,3.28 1.48,7.72 z m -20.84,0 q 0,4.48 1.72,7.08 1.72,2.56 5.52,2.56 3.88,0 5.56,-2.56 1.68,-2.6 1.68,-7.08 0,-4.52 -1.68,-7.08 -1.68,-2.56 -5.52,-2.56 -3.84,0 -5.56,2.56 -1.72,2.56 -1.72,7.08 z"
|
||||
id="text2"
|
||||
style="font-weight:bold;font-size:40px;line-height:1.25;-inkscape-font-specification:'sans-serif Bold';white-space:pre;fill:#fbe9e7"
|
||||
inkscape:label="O"
|
||||
transform="matrix(2.799327,0,0,3.3785361,-962.26923,-98.905679)"
|
||||
aria-label="O" />
|
||||
<path
|
||||
d="m 47.193672,141.59227 -6.88,-22.4 h -0.16 q 0.04,0.8 0.12,2.4 0.08,1.6 0.16,3.44 0.08,1.8 0.08,3.28 v 13.28 h -5.4 v -28.56 h 8.24 l 6.76,21.84 h 0.12 l 7.16,-21.84 h 8.24 v 28.56 h -5.64 v -13.52 q 0,-1.36 0.04,-3.12 0.08,-1.76 0.12,-3.32 0.08,-1.6 0.12,-2.4 h -0.16 l -7.36,22.36 z"
|
||||
id="text3"
|
||||
style="font-weight:bold;font-size:40px;line-height:1.25;-inkscape-font-specification:'sans-serif Bold';white-space:pre;fill:#fbe9e7"
|
||||
inkscape:label="M"
|
||||
transform="matrix(2.9268206,0,0,2.9268206,53.853031,-147.27301)"
|
||||
aria-label="M" />
|
||||
<path
|
||||
d="m 439.97344,258.31884 h -21.24 v -3.92 l 13.68,-19.64 h -13.32 v -5 h 20.52 v 3.92 l -13.68,19.64 h 14.04 z"
|
||||
id="text4"
|
||||
style="font-weight:bold;font-size:40px;line-height:1.25;-inkscape-font-specification:'sans-serif Bold';white-space:pre;fill:#fbe9e7"
|
||||
inkscape:label="Z"
|
||||
transform="matrix(3.1593397,0,0,2.8648022,-1159.7463,-343.82656)"
|
||||
aria-label="Z" />
|
||||
<path
|
||||
d="m 471.70703,286.1118 h -6.04 v -12.32 h -11.32 v 12.32 h -6.04 v -28.56 h 6.04 v 11.2 h 11.32 v -11.2 h 6.04 z"
|
||||
id="text5"
|
||||
style="font-weight:bold;font-size:40px;line-height:1.25;-inkscape-font-specification:'sans-serif Bold';white-space:pre;fill:#fbe9e7"
|
||||
inkscape:label="H"
|
||||
transform="matrix(2.900492,0,0,2.900492,-998.44727,-381.36539)"
|
||||
aria-label="H" />
|
||||
<g
|
||||
id="g10"
|
||||
inkscape:label="I">
|
||||
<path
|
||||
id="path10"
|
||||
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:40px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';white-space:pre;shape-inside:url(#rect6);display:inline;fill:#fbe9e7;fill-opacity:1;stroke:none"
|
||||
d="m 452.34766,289.85002 c 0.22541,-0.20952 0.45142,-0.41589 0.67406,-0.63903 0.32908,-0.32981 0.65502,-0.67506 0.97635,-1.03568 0.32133,-0.36061 0.63824,-0.73678 0.94979,-1.12946 0.31155,-0.39269 0.61727,-0.80176 0.91702,-1.22778 0.29975,-0.42602 0.59324,-0.86886 0.87916,-1.32948 0.28593,-0.46063 0.56447,-0.93921 0.83453,-1.43571 0.16921,-0.31108 0.32867,-0.64231 0.491,-0.96787 h -7.06609 c -0.0345,0.0663 -0.0646,0.13695 -0.0994,0.20284 -0.32015,0.60473 -0.65585,1.19202 -1.00573,1.75663 -0.32204,0.51971 -0.65924,1.01474 -1.0046,1.49221 l 3.45395,1.58826 z"
|
||||
transform="matrix(3.4567616,0,0,3.4567616,-1200.9959,-724.14164)" />
|
||||
<path
|
||||
id="path9"
|
||||
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:40px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';white-space:pre;shape-inside:url(#rect6);display:inline;fill:#fbe9e7;fill-opacity:1;stroke:none"
|
||||
d="m 451.63291,310.64486 h 10.2347 v -3.43981 l -3.47993,-1.60013 v -18.47997 l 3.47993,-1.60013 v -3.43981 h -3.79804 c -0.16233,0.32556 -0.32179,0.65679 -0.491,0.96787 -0.27006,0.4965 -0.5486,0.97508 -0.83453,1.43571 -0.28592,0.46062 -0.57941,0.90346 -0.87916,1.32948 -0.29975,0.42602 -0.60547,0.83509 -0.91702,1.22778 -0.31155,0.39268 -0.62846,0.76885 -0.94979,1.12946 -0.32133,0.36062 -0.64727,0.70587 -0.97635,1.03568 -0.22264,0.22314 -0.44865,0.42951 -0.67406,0.63903 v 15.18763 h 0.14634 c 0.46872,0 0.87071,0.0248 1.20969,0.0729 0.33899,0.0481 0.61522,0.11925 0.83284,0.21132 0.10881,0.046 0.20303,0.0975 0.28307,0.15368 0.08,0.0562 0.14601,0.11772 0.19832,0.18363 0.0523,0.0659 0.0908,0.13625 0.11639,0.21132 0.0256,0.0751 0.0384,0.15474 0.0384,0.23844 0,0.13392 -0.0422,0.48538 -0.15312,0.93736 -0.0554,0.22599 -0.12811,0.47691 -0.22149,0.73847 -0.0934,0.26157 -0.20712,0.53392 -0.34522,0.80176 -0.13811,0.26784 -0.30024,0.53151 -0.48987,0.77633 -0.18964,0.24482 -0.4069,0.47082 -0.65486,0.66333 -0.12398,0.0963 -0.25567,0.18392 -0.39551,0.2616 -0.13984,0.0777 -0.28812,0.14513 -0.44466,0.20058 -0.15655,0.0554 -0.32142,0.0987 -0.49552,0.12826 -0.10754,0.0183 -0.22508,0.021 -0.33958,0.0283 z"
|
||||
transform="matrix(3.4567616,0,0,3.4567616,-1200.9959,-724.14164)" />
|
||||
<path
|
||||
id="path8"
|
||||
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:40px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';white-space:pre;shape-inside:url(#rect6);display:inline;fill:#fbe9e7;fill-opacity:1;stroke:none"
|
||||
d="m 451.63291,310.64486 c 0.1145,-0.007 0.23204,-0.01 0.33958,-0.0283 0.1741,-0.0295 0.33897,-0.0728 0.49552,-0.12826 0.15654,-0.0555 0.30482,-0.12289 0.44466,-0.20058 0.13984,-0.0777 0.27153,-0.16534 0.39551,-0.2616 0.24796,-0.19251 0.46522,-0.41851 0.65486,-0.66333 0.18963,-0.24482 0.35176,-0.50849 0.48987,-0.77633 0.1381,-0.26784 0.25184,-0.54019 0.34522,-0.80176 0.0934,-0.26156 0.16604,-0.51248 0.22149,-0.73847 0.1109,-0.45198 0.15312,-0.80344 0.15312,-0.93736 0,-0.0837 -0.0128,-0.16337 -0.0384,-0.23844 -0.0256,-0.0751 -0.0641,-0.1454 -0.11639,-0.21132 -0.0523,-0.0659 -0.11828,-0.12739 -0.19832,-0.18363 -0.08,-0.0562 -0.17426,-0.10765 -0.28307,-0.15368 -0.21762,-0.0921 -0.49385,-0.16319 -0.83284,-0.21132 -0.33898,-0.0481 -0.74097,-0.0729 -1.20969,-0.0729 h -0.14634 v 0.56727 l -3.47994,1.60013 v 3.43981 z"
|
||||
transform="matrix(3.4567616,0,0,3.4567616,-1200.9959,-724.14164)" />
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 9.8 KiB |
@@ -1,12 +1,62 @@
|
||||
/*General theming*/
|
||||
|
||||
:root, :root.dark {
|
||||
/* Global Values */
|
||||
--main-border-color: #b2b2b2;
|
||||
--accent-color: #f57c00;
|
||||
--textarea-border: #9d9d9d;
|
||||
--select-shadow: rgba(245, 124, 0, 0, 0.25);
|
||||
--engine-options-shadow: rgba(0, 0, 0, 0.1);
|
||||
--engine-options-hover-bg: #f0f0f0;
|
||||
/* Dark Mode Values */
|
||||
--bg-color: #222;
|
||||
--fg-color: #f8f9fa;
|
||||
--button-fg: #010000;
|
||||
--textarea-focus-border: #e5ebff;
|
||||
--textarea-bg: var(--bg-color);
|
||||
--select-border: #ccc;
|
||||
--select-bg: #2f2f2f;
|
||||
--select-fg: #fff;
|
||||
--select-hover: #595959;
|
||||
--search-text: #fff;
|
||||
}
|
||||
|
||||
@media (prefers-color-scheme: light) {
|
||||
:root {
|
||||
--bg-color: #ffedd5;
|
||||
--fg-color: #000000;
|
||||
--button-fg: #fff;
|
||||
--textarea-focus-border: #261f1e;
|
||||
--textarea-bg: #fff4e6;
|
||||
--select-border: #888888;
|
||||
--select-bg: #fff;
|
||||
--select-fg: #2f2f2f;
|
||||
--select-hover: #e0e0e0;
|
||||
--search-text: #000000;
|
||||
}
|
||||
}
|
||||
|
||||
:root.light {
|
||||
--bg-color: #ffedd5;
|
||||
--fg-color: #000000;
|
||||
--button-fg: #fff;
|
||||
--textarea-focus-border: #261f1e;
|
||||
--textarea-bg: #fff4e6;
|
||||
--select-border: #888888;
|
||||
--select-bg: #fff;
|
||||
--select-fg: #2f2f2f;
|
||||
--select-hover: #e0e0e0;
|
||||
--search-text: #000000;
|
||||
}
|
||||
|
||||
body {
|
||||
font-family: sans-serif;
|
||||
margin: 20px auto;
|
||||
line-height: 1.5em;
|
||||
max-width: 1000px;
|
||||
font-size: 1rem;
|
||||
background-color: #222;
|
||||
color: #f8f9fa;
|
||||
background-color: var(--bg-color);
|
||||
color: var(--fg-color);
|
||||
padding: 0 10px;
|
||||
hyphens: auto;
|
||||
}
|
||||
@@ -18,13 +68,13 @@ header {
|
||||
white-space: nowrap;
|
||||
flex-wrap: wrap;
|
||||
|
||||
border-bottom: 1px solid #b2b2b2;
|
||||
border-bottom: 1px solid var(--main-border-color);
|
||||
width: 95%;
|
||||
}
|
||||
|
||||
footer {
|
||||
width: 95%;
|
||||
border-top: 1px solid #b2b2b2;
|
||||
border-top: 1px solid var(--main-border-color);
|
||||
}
|
||||
|
||||
footer p {
|
||||
@@ -32,7 +82,7 @@ footer p {
|
||||
}
|
||||
|
||||
a {
|
||||
color: #f57c00;
|
||||
color: var(--accent-color);
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
@@ -41,7 +91,7 @@ a:hover {
|
||||
}
|
||||
|
||||
#url {
|
||||
color: #010000;
|
||||
color: var(--button-fg);
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
@@ -69,15 +119,14 @@ textarea {
|
||||
width: 100%;
|
||||
font-size: 1rem;
|
||||
padding: 4px;
|
||||
border: 2px solid #888888;
|
||||
background-color: #222;
|
||||
border-color: #9d9d9d;
|
||||
color: #f8f9fa;
|
||||
background-color: var(--textarea-bg);
|
||||
color: var(--fg-color);
|
||||
border: 2px solid var(--textarea-border);
|
||||
}
|
||||
|
||||
textarea:focus {
|
||||
border-color: #e5ebff;
|
||||
outline: 1px solid #e5ebff;
|
||||
border-color: var(--textarea-focus-border);
|
||||
outline: 1px solid var(--textarea-focus-border);
|
||||
}
|
||||
|
||||
select {
|
||||
@@ -89,11 +138,11 @@ select {
|
||||
border-bottom: none;
|
||||
border-top: none;
|
||||
border-radius: 4px;
|
||||
border-left: 2px solid #f57c00;
|
||||
border-left: 2px solid var(--accent-color);
|
||||
/* Accent shadow */
|
||||
box-shadow: 2px 2px 0px 0px rgba(245, 124, 0, 0.25);
|
||||
color: #b2b2b2;
|
||||
background-color: #2f2f2f;
|
||||
box-shadow: 2px 2px 0px 0px var(--select-shadow);
|
||||
color: var(--select-fg);
|
||||
background-color: var(--select-bg);
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
@@ -105,11 +154,12 @@ button {
|
||||
gap: 2px;
|
||||
border: none;
|
||||
border-radius: 4px;
|
||||
background: #f57c00;
|
||||
background: var(--accent-color);
|
||||
color: var(--button-fg);
|
||||
}
|
||||
|
||||
button:hover {
|
||||
box-shadow: 5px 5px 0px 0px rgba(245, 124, 0, 0.25);
|
||||
box-shadow: 5px 5px 0px 0px var(--select-shadow);
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
@@ -123,11 +173,11 @@ button:hover {
|
||||
gap: 2px;
|
||||
border: none;
|
||||
border-radius: 4px;
|
||||
background: #f57c00;
|
||||
background: var(--accent-color);
|
||||
}
|
||||
|
||||
.button:hover {
|
||||
box-shadow: 5px 5px 0px 0px rgba(245, 124, 0, 0.25);
|
||||
box-shadow: 5px 5px 0px 0px var(--select-shadow);
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
@@ -168,19 +218,19 @@ button:hover {
|
||||
|
||||
.selected-option {
|
||||
padding: 7px;
|
||||
border: 1px solid #ccc;
|
||||
border: 1px solid var(--select-border);
|
||||
border-radius: 4px;
|
||||
text-decoration: none;
|
||||
color: #f8f9fa;
|
||||
color: var(--fg-color);
|
||||
}
|
||||
|
||||
.options {
|
||||
display: none;
|
||||
position: absolute;
|
||||
background-color: #222;
|
||||
border: 1px solid #ccc;
|
||||
background-color: var(--bg-color);
|
||||
border: 1px solid var(--select-border);
|
||||
border-radius: 4px;
|
||||
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
|
||||
box-shadow: 0 2px 4px var(--engine-options-shadow);
|
||||
list-style: none;
|
||||
padding: 0;
|
||||
margin: 0;
|
||||
@@ -193,10 +243,11 @@ button:hover {
|
||||
}
|
||||
|
||||
.options li:hover {
|
||||
background-color: #f0f0f0;
|
||||
background-color: var(--engine-options-hover-bg);
|
||||
}
|
||||
|
||||
.custom-select:hover .options {
|
||||
.custom-select:hover .options,
|
||||
.custom-select:focus-within .options {
|
||||
display: block;
|
||||
}
|
||||
|
||||
@@ -208,9 +259,27 @@ button:hover {
|
||||
border-bottom: none;
|
||||
border-top: none;
|
||||
border-radius: 4px;
|
||||
border-left: 2px solid #f57c00;
|
||||
border-left: 2px solid var(--accent-color);
|
||||
/* The rgba is the same value as above, but with a 0.25 opacity */
|
||||
box-shadow: 2px 2px 0px 0px rgba(245, 124, 0, 0.25);
|
||||
box-shadow: 2px 2px 0px 0px var(--select-shadow);
|
||||
background-color: var(--select-bg);
|
||||
color: var(--select-fg);
|
||||
}
|
||||
|
||||
.nice-select .nice-select-dropdown {
|
||||
background-color: var(--select-bg);
|
||||
color: var(--select-fg);
|
||||
}
|
||||
|
||||
.nice-select .nice-select-search {
|
||||
background-color: var(--select-bg);
|
||||
color: var(--search-text);
|
||||
}
|
||||
|
||||
.nice-select .option:hover,
|
||||
.nice-select .option.focus,
|
||||
.nice-select .option.selected.focus {
|
||||
background-color: var(--select-hover);
|
||||
}
|
||||
|
||||
.center-area {
|
||||
@@ -230,79 +299,6 @@ button:hover {
|
||||
margin: auto;
|
||||
}
|
||||
|
||||
@media (prefers-color-scheme: light) {
|
||||
.options {
|
||||
background-color: #ffedd5;
|
||||
border: 1px solid #ccc;
|
||||
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
|
||||
}
|
||||
|
||||
.options li:hover {
|
||||
background-color: #f0f0f0;
|
||||
}
|
||||
|
||||
.selected-option {
|
||||
border: 1px solid #888888;
|
||||
color: #000;
|
||||
}
|
||||
|
||||
/* Theming for buttons and text areas*/
|
||||
textarea {
|
||||
border: 2px solid #888888;
|
||||
background-color: #fff4e6;
|
||||
border-color: #9d9d9d;
|
||||
color: #000;
|
||||
}
|
||||
|
||||
textarea:focus {
|
||||
border-color: #261f1e;
|
||||
outline: 1px solid #261f1e;
|
||||
}
|
||||
|
||||
select,
|
||||
.nice-select .nice-select-dropdown,
|
||||
.nice-select,
|
||||
.nice-select-search {
|
||||
background-color: #fff;
|
||||
color: #2f2f2f;
|
||||
}
|
||||
|
||||
body {
|
||||
background-color: #ffedd5;
|
||||
color: #000;
|
||||
}
|
||||
|
||||
button,
|
||||
#url {
|
||||
color: #fbe9e7;
|
||||
}
|
||||
|
||||
header {
|
||||
border-bottom: 1px solid #b2b2b2;
|
||||
}
|
||||
|
||||
footer {
|
||||
border-top: 1px solid #b2b2b2;
|
||||
}
|
||||
|
||||
.def_type {
|
||||
color: cyan;
|
||||
text-transform: capitalize;
|
||||
}
|
||||
|
||||
.syn {
|
||||
color: burlywood;
|
||||
}
|
||||
|
||||
.syn_type {
|
||||
color: cyan;
|
||||
}
|
||||
|
||||
.use_in_sentence {
|
||||
color: yellow;
|
||||
}
|
||||
}
|
||||
|
||||
#definitions_and_translations {
|
||||
display: grid;
|
||||
margin: auto;
|
||||
|
@@ -17,6 +17,7 @@ import (
|
||||
"github.com/gofiber/fiber/v2"
|
||||
"github.com/gofiber/fiber/v2/middleware/compress"
|
||||
"github.com/gofiber/fiber/v2/middleware/filesystem"
|
||||
|
||||
//"github.com/gofiber/fiber/v2/middleware/limiter"
|
||||
// For debugging purposes
|
||||
// "github.com/gofiber/fiber/v2/middleware/logger"
|
||||
@@ -37,11 +38,19 @@ func Serve(port string) {
|
||||
views := http.FS(views.GetFiles())
|
||||
engine := html.NewFileSystem(views, ".html")
|
||||
|
||||
engine.AddFunc(
|
||||
"newlinetobr", func(s string) template.HTML {
|
||||
return template.HTML(strings.ReplaceAll(strings.ReplaceAll(s, "\n", "<br>"), "\r", ""))
|
||||
},
|
||||
)
|
||||
engine.AddFunc("newlinetobr", func(s string) template.HTML {
|
||||
return template.HTML(strings.ReplaceAll(strings.ReplaceAll(s, "\n", "<br>"), "\r", ""))
|
||||
})
|
||||
|
||||
// Returns specific string if a string is in another slice
|
||||
engine.AddFunc("contains", func(data []string, s string, retval string) template.HTML {
|
||||
for _, val := range data {
|
||||
if val == s {
|
||||
return template.HTML(retval)
|
||||
}
|
||||
}
|
||||
return template.HTML("")
|
||||
})
|
||||
|
||||
app := fiber.New(fiber.Config{
|
||||
Views: engine,
|
||||
@@ -86,6 +95,11 @@ func Serve(port string) {
|
||||
})
|
||||
|
||||
api := app.Group("/api")
|
||||
// Set CORS Header for all API endpoints
|
||||
api.Use(func(c *fiber.Ctx) error {
|
||||
c.Set("Access-Control-Allow-Origin", "*")
|
||||
return c.Next()
|
||||
})
|
||||
api.All("/translate", pages.HandleTranslate)
|
||||
api.All("/image", pages.HandleImg)
|
||||
api.Get("/source_languages", pages.HandleSourceLanguages)
|
||||
@@ -103,11 +117,11 @@ func Serve(port string) {
|
||||
app.All("/", pages.HandleIndex)
|
||||
app.All("/switchlanguages", func(c *fiber.Ctx) error {
|
||||
engine := utils.Sanitize(utils.GetQueryOrFormValue(c, "engine"), "alpha")
|
||||
from := utils.Sanitize(utils.GetQueryOrFormValue(c, "from"), "alpha")
|
||||
to := utils.Sanitize(utils.GetQueryOrFormValue(c, "to"), "alpha")
|
||||
from := utils.GetQueryOrFormValue(c, "from")
|
||||
to := utils.GetQueryOrFormValue(c, "to")
|
||||
text := utils.GetQueryOrFormValue(c, "text")
|
||||
var swapText string
|
||||
if engine != "all" && text != "" {
|
||||
if engine != "all" && engine != "some" && text != "" {
|
||||
translation, tlerr := libmozhi.Translate(engine, to, from, text)
|
||||
if tlerr == nil {
|
||||
swapText = translation.OutputText
|
||||
|
@@ -1,10 +1,11 @@
|
||||
package utils
|
||||
|
||||
import (
|
||||
"codeberg.org/aryak/libmozhi"
|
||||
"github.com/gofiber/fiber/v2"
|
||||
"os"
|
||||
"regexp"
|
||||
|
||||
"codeberg.org/aryak/libmozhi"
|
||||
"github.com/gofiber/fiber/v2"
|
||||
)
|
||||
|
||||
var nonAlphanumericRegex = regexp.MustCompile(`[^a-zA-Z,]+`)
|
||||
@@ -34,7 +35,7 @@ func Sanitize(str string, strip string) string {
|
||||
}
|
||||
|
||||
func EngineList() map[string]string {
|
||||
engines := map[string]string{"all": "All Engines", "google": "Google", "deepl": "DeepL", "duckduckgo": "DuckDuckGo", "libre": "LibreTranslate", "mymemory": "MyMemory", "reverso": "Reverso", "yandex": "Yandex"}
|
||||
engines := map[string]string{"all": "All Engines", "some": "Some Engines", "google": "Google", "deepl": "DeepL", "duckduckgo": "DuckDuckGo", "libre": "LibreTranslate", "mymemory": "MyMemory", "reverso": "Reverso", "yandex": "Yandex"}
|
||||
if EnvTrueNoExist("MOZHI_GOOGLE_ENABLED") == false {
|
||||
delete(engines, "google")
|
||||
} else if EnvTrueNoExist("MOZHI_DEEPL_ENABLED") == false {
|
||||
|
23
views/deepl_extras.html
Normal file
23
views/deepl_extras.html
Normal file
@@ -0,0 +1,23 @@
|
||||
<div id="definitions_and_translations">
|
||||
<div class="translations">
|
||||
{{ if or .Translation.TargetSynonyms .Translation.SourceSynonyms }}
|
||||
<span class="def_type">Synonyms & Equivalent Words</span>
|
||||
<ul>
|
||||
{{ if .Translation.TargetSynonyms }}
|
||||
<li>
|
||||
<span class="syn_type">Synonyms for {{.Translation.OutputText}}</span>
|
||||
<span class="syn">{{ range $index, $key := .Translation.TargetSynonyms }}{{ if eq $key "" }}{{ else }}{{ if eq $index 0 }}{{ else }}, {{ end }}{{.}}{{ end }}{{ end }}</span>
|
||||
</li>
|
||||
<br>
|
||||
{{ end }}
|
||||
{{ if .Translation.SourceSynonyms }}
|
||||
<li>
|
||||
<span class="syn_type">Synonyms for {{.OriginalText}}</span>
|
||||
<span class="syn">{{ range $index, $key := .Translation.SourceSynonyms }}{{ if eq $key "" }}{{ else }}{{ if eq $index 0 }}{{ else }}, {{ end }}{{.}}{{ end }}{{ end }}</span>
|
||||
</li>
|
||||
<br>
|
||||
{{ end }}
|
||||
</ul>
|
||||
{{ end }}
|
||||
</div>
|
||||
</div>
|
@@ -14,18 +14,84 @@
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||
<meta charset="UTF-8" />
|
||||
<meta name="referrer" content="no-referrer" />
|
||||
<script src="/js/nice-select2.js"></script>
|
||||
<link rel="stylesheet" href="/css/nice-select2.css">
|
||||
<script src="/js/nice-select2.js"></script>
|
||||
<link rel="stylesheet" href="/css/nice-select2.css" />
|
||||
<link rel="stylesheet" href="/css/style.css" />
|
||||
<link rel="manifest" href="/manifest.json">
|
||||
<link rel="manifest" href="/manifest.json" />
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<header>
|
||||
<a href="/"><img src="/assets/mozhi.png" alt="Mozhi Logo" class="navlogo" /></a>
|
||||
<a href="/"
|
||||
><img src="/assets/mozhi.png" alt="Mozhi Logo" class="navlogo"
|
||||
/></a>
|
||||
<nav>
|
||||
<a href="/about">About</a>
|
||||
<a href="/api/swagger">API</a>
|
||||
<button onclick="toggleDarkMode()">
|
||||
<svg
|
||||
width="20px"
|
||||
height="20px"
|
||||
viewBox="0 0 24 24"
|
||||
version="1.1"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:xlink="http://www.w3.org/1999/xlink"
|
||||
>
|
||||
<g
|
||||
id="🔍-Product-Icons"
|
||||
stroke="none"
|
||||
stroke-width="1"
|
||||
fill="none"
|
||||
fill-rule="evenodd"
|
||||
>
|
||||
<g
|
||||
id="ic_fluent_dark_theme_24_regular"
|
||||
fill="#212121"
|
||||
fill-rule="nonzero"
|
||||
>
|
||||
<path
|
||||
d="M12,22 C17.5228475,22 22,17.5228475 22,12 C22,6.4771525 17.5228475,2 12,2 C6.4771525,2 2,6.4771525 2,12 C2,17.5228475 6.4771525,22 12,22 Z M12,20.5 L12,3.5 C16.6944204,3.5 20.5,7.30557963 20.5,12 C20.5,16.6944204 16.6944204,20.5 12,20.5 Z"
|
||||
id="🎨-Color"
|
||||
></path>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
||||
</button>
|
||||
</nav>
|
||||
</header>
|
||||
<script>
|
||||
function toggleDarkMode() {
|
||||
if (document.documentElement.classList.contains("light")) {
|
||||
document.documentElement.classList.remove("light");
|
||||
document.documentElement.classList.add("dark");
|
||||
document.cookie = "colour=dark";
|
||||
} else if (document.documentElement.classList.contains("dark")) {
|
||||
document.documentElement.classList.remove("dark");
|
||||
document.documentElement.classList.add("light");
|
||||
document.cookie = "colour=light";
|
||||
} else {
|
||||
if (
|
||||
window.matchMedia &&
|
||||
window.matchMedia("(prefers-color-scheme: light)").matches
|
||||
) {
|
||||
document.documentElement.classList.add("dark");
|
||||
document.cookie = "colour=dark";
|
||||
} else {
|
||||
document.documentElement.classList.add("light");
|
||||
document.cookie = "colour=light";
|
||||
}
|
||||
}
|
||||
}
|
||||
const colourScheme = document.cookie
|
||||
.split("; ")
|
||||
.find((row) => row.startsWith("colour="))
|
||||
?.split("=")[1];
|
||||
if (colourScheme === "light") {
|
||||
document.documentElement.classList.remove("dark");
|
||||
document.documentElement.classList.add("light");
|
||||
} else if (colourScheme === "dark") {
|
||||
document.documentElement.classList.remove("light");
|
||||
document.documentElement.classList.add("dark");
|
||||
}
|
||||
</script>
|
||||
<br />
|
||||
|
@@ -14,18 +14,32 @@
|
||||
</div>
|
||||
<br />
|
||||
<br />
|
||||
{{ if eq .Engine "some" }}
|
||||
<form action="/" method="get" id="enginesForm">
|
||||
<select name="engines" aria-label="Engines you want to use" id="engines" multiple>
|
||||
{{ range $key, $value := .enginesNames}}
|
||||
<option value="{{ $key }}" {{ contains $.SomeEngines $key "selected" }}>
|
||||
{{ $value }}
|
||||
</option>
|
||||
{{end}}
|
||||
</select>
|
||||
<button type="submit">Select Engines</button>
|
||||
{{ end }}
|
||||
<form action="/" method="post" id="translation-form">
|
||||
<!-- This hidden input is so that the engine gets sent in the request even though its not declared here -->
|
||||
<input name="engine" value="{{.Engine}}" type="hidden" />
|
||||
{{ if eq .Engine "some" }}
|
||||
<input name="engines" value="{{.EnginesNamesStr}}" type="hidden" />
|
||||
{{ end }}
|
||||
<div class="wrap languages center-area">
|
||||
<div class="language">
|
||||
<select name="from" aria-label="Source language" id="sourceLanguage">
|
||||
{{ range $key, $value := .SourceLanguages }} {{ if $.From }}
|
||||
<option value="{{ .Id }}" {{ if eq $.From .Id }}selected{{ end }}>
|
||||
{{ range $key, $value := .SourceLanguages }} {{ if eq $.From "" }}
|
||||
<option value="{{ .Id }}" {{ if eq .Id $.defaultLang }}selected{{ end }}>
|
||||
{{ .Name }}
|
||||
</option>
|
||||
{{ else }}
|
||||
<option value="{{ .Id }}" {{ if eq .Id $.defaultLang }}selected{{ end }}>
|
||||
<option value="{{ .Id }}" {{ if eq $.From .Id }}selected{{ end }}>
|
||||
{{ .Name }}
|
||||
</option>
|
||||
{{ end }} {{ end }}
|
||||
@@ -59,6 +73,22 @@
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
{{ if .TranslationExists }}
|
||||
<div style="display:flex;
|
||||
justify-content:space-around;
|
||||
align-items:center">
|
||||
<button class="wrap" type="button" onclick="copyToClipboard()">Copy the translation</button>
|
||||
{{ if and .Engine .From .To .OriginalText }}
|
||||
<p>
|
||||
<a id="url"
|
||||
class="button"
|
||||
onclick="copyLinkToClipboard(event)"
|
||||
href="/?engine={{.Engine}}&from={{.From}}&to={{.To}}&text={{.OriginalText}}">Copy translation link</a>
|
||||
</p>
|
||||
{{ end }}
|
||||
<button class="wrap" type="submit">Translate!</button>
|
||||
</div>
|
||||
{{ end }}
|
||||
<div class="center-area2 item-wrapper">
|
||||
Source Text:
|
||||
<textarea autofocus class="item" id="input" name="text" dir="auto" placeholder="Enter Text Here">
|
||||
@@ -74,8 +104,8 @@
|
||||
{{ end }}
|
||||
<br>
|
||||
</div>
|
||||
{{ if .TranslateAll }}
|
||||
{{ range $key, $value := .TranslateAll }}
|
||||
{{ if .TranslateMany }}
|
||||
{{ range $key, $value := .TranslateMany }}
|
||||
<div class="item-wrapper center-area2">
|
||||
Engine: {{.Engine}}
|
||||
<textarea class="translation item" dir="auto" placeholder="Translation" id="output" readonly>
|
||||
@@ -114,31 +144,15 @@
|
||||
<br>
|
||||
{{ end }}
|
||||
{{ end }}
|
||||
<div style="display:flex;
|
||||
justify-content:space-around;
|
||||
align-items:center">
|
||||
{{ if .TranslationExists }}
|
||||
<button class="wrap" type="button" onclick="copyToClipboard()">Copy the translation</button>
|
||||
{{ end }}
|
||||
{{ if and .Engine .From .To .OriginalText }}
|
||||
<p>
|
||||
<a id="url"
|
||||
class="button"
|
||||
onclick="copyLinkToClipboard(event)"
|
||||
href="/?engine={{.Engine}}&from={{.From}}&to={{.To}}&text={{.OriginalText}}">Copy translation link</a>
|
||||
</p>
|
||||
{{ end }}
|
||||
{{ if .TranslationExists }}
|
||||
<button class="wrap" type="submit">Translate!</button>
|
||||
{{ else }}
|
||||
<button class="wrap"
|
||||
style="margin-left:auto;
|
||||
position:relative;
|
||||
left:-10%;
|
||||
margin-top: 1%"
|
||||
type="submit">Translate!</button>
|
||||
{{ end }}
|
||||
</div>
|
||||
{{ if not .TranslationExists }}
|
||||
<button class="wrap"
|
||||
style="margin-left:auto;
|
||||
position:relative;
|
||||
left:-10%;
|
||||
margin-top: 1%"
|
||||
type="submit">Translate!</button>
|
||||
{{ end }}
|
||||
|
||||
</div>
|
||||
{{ if eq .Engine "yandex" }}
|
||||
{{ template "yandex_extras" . }}
|
||||
@@ -149,6 +163,9 @@
|
||||
{{ if eq .Engine "google" }}
|
||||
{{ template "google_extras" . }}
|
||||
{{ end }}
|
||||
{{ if eq .Engine "deepl" }}
|
||||
{{ template "deepl_extras" . }}
|
||||
{{ end }}
|
||||
</form>
|
||||
<script>
|
||||
// @license magnet:?xt=urn:btih:0b31508aeb0634b347b8270c7bee4d411b5d4109&dn=agpl-3.0.txt AGPL-3.0
|
||||
|
Reference in New Issue
Block a user