From d1d7f56ce49a6f559577d3e21c7941624d1c79af Mon Sep 17 00:00:00 2001 From: shine <1042864399@qq.com> Date: Fri, 11 Oct 2024 18:46:40 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=8C=E5=96=84=E4=B8=AA=E4=BA=BA=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E7=BB=B4=E6=8A=A4,=20=E5=88=9D=E6=AD=A5=E5=BB=BA?= =?UTF-8?q?=E7=AB=8B=E5=B1=80=E5=9F=9F=E7=BD=91=E9=93=BE=E6=8E=A5=E9=80=BB?= =?UTF-8?q?=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- assets/theme.go | 2 +- assets/wolf_logo.png | Bin 0 -> 18657 bytes cfg/config.go | 22 +++-- go.mod | 36 ++++++-- go.sum | 78 +++++++++++++++++ main.go | 2 +- models/{execFiles.go => execFilesCards.go} | 0 models/online.go | 48 ++++++++++ models/user.go | 2 +- repo/user.go | 5 +- service/server.go | 72 +++++++++++++++ service/zeroconf.go | 68 +++++++++++++++ views/userView.go | 97 ++++++++++++++++++--- 13 files changed, 403 insertions(+), 29 deletions(-) create mode 100644 assets/wolf_logo.png rename models/{execFiles.go => execFilesCards.go} (100%) create mode 100644 models/online.go create mode 100644 service/server.go create mode 100644 service/zeroconf.go diff --git a/assets/theme.go b/assets/theme.go index bd9716e..87913e1 100644 --- a/assets/theme.go +++ b/assets/theme.go @@ -15,7 +15,7 @@ var _ fyne.Theme = (*MyTheme)(nil) //go:embed simkai.ttf var arialNovaLight []byte -//go:embed logo.jpg +//go:embed wolf_logo.png var logoData []byte var LogoDataSR = &fyne.StaticResource{ diff --git a/assets/wolf_logo.png b/assets/wolf_logo.png new file mode 100644 index 0000000000000000000000000000000000000000..68eb8f9ea47ce3184824090408500b24ea8b43e0 GIT binary patch literal 18657 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�Hb{OCS6~~905Om{Ki`bo)$Mg%&;F4 zGHFOyL_2c_cEwo-f%|;@+rAk&rB+c$i#aWjV!SZ-icXC5ve2bs0H4%u(nZh)mLBp1 zbB8$TOgi&bD7OjkD${51BU1nr4scKy z4ul?Ah`HLNs-B49`Cl%C2>azD5C2FmpaE4XmS4eGO1=@Su&M?7wqiN{VdIM|UZ1B! z?*%RJ{lyuIG47xM%8AFz>VabLzj{IUTm~3kNR;@0$wwY0(w3nCdTYPWG=p-Sx4+PMB(K>8wwQ6rUD6a%AN-i(rs&cOv^sVKN>E!|692XG}O>Nl^`_-aZqv)2Uk2q{BFen>*)~i5?*nVe5lE~q|HBn-#+%HZs zAcsVg9@XjrNLka8KJh7l0X=BBp_QV*X{x6Rknw=ugbMGCz=Hq`a%>ByX?tPt^iwiV zFumRO1V5P6-k7H85^Kqae8~(cpq)Ol@t2e*D|AdHbGFb5Cj|D^WRN5Q&op6aRPhnZ zZ(S5~jmg?eCF7r^UR$Hn!3IY%4!$B=sv>q$D4BPg=hv79=ri_UjM)EtpfLPivbLN? z-DvqTU@^LDaj1E{<6`S|z{&qo&}`MfbA(a(iv4j&*4G~0ZM6owfrtJ1v=(5dw$>i8 zWrtaJDTa>T(U_9FFVt&8=WbcV++e->1}>FaIeq{{>I&o>!fsoJ^dARqmxS{wCg1yV z7$ACVlQ#-D>Ev~Yb-KLaT136l@4X&UM5I5<7C6q7IFn<5*PWP)a(n49YO`M5CT4}a zEB|Mn%UkE)|8mFvuA_oB(2zBk8i6A%2Rc~ZX=ciMo|pUhYp34t<|V?Q1xK?N>F2dN z6apP`bSY0e(5y(7IQ`7)d9?@Tx-EHh>-T2%+Urk&E7CoI=BQovy8v8t16(w}*Z)%Y zvyM|=zwhn6(EM-ZB)zp-MNN&s2Ce`@@PWr+K>uhn`Eyybrt$x}f9jO;oJI#Xpp>L4 zb2w<85E%U%fr&V2;xRt(yrF}FGSKv%NsZdznPmpx5QYH5Mvr86;IImClzf69Fr!0y z)xh3e1N6{_jle+xpg{sBI)G_vamoW=oeeTtK@6x^=h6+(@H&v60zCU;LZDFrE5s-P zP>m**`39sBXta?Mu!zu*+`$Afssnf?g+RAS8PtuEz%-FEg(n7T)DfWK4p%8_s2h8L xJ}~lPTL(2N38?spQm-u7O%0>or66|y%l{6ssl2wGe-i@`c)I$ztaD0e0s!W@l_~%L literal 0 HcmV?d00001 diff --git a/cfg/config.go b/cfg/config.go index 67e98c4..7381d20 100644 --- a/cfg/config.go +++ b/cfg/config.go @@ -7,20 +7,30 @@ import ( ) type Config struct { - DbPath string `ini:"dbPath"` - CardDir string `ini:"cardDir"` - CardInfo string `ini:"cardInfo"` + DbPath string `ini:"db_path"` + CardDir string `ini:"card_dir"` + CardInfo string `ini:"card_info"` + Avatar string `ini:"avatar"` + + ZeroconfKey string `ini:"zeroconf_key"` + ZeroconfPort int `ini:"zeroconf_port"` + ServerAddr string `ini:"server_addr"` } var T = Config{ - DbPath: "./data/data.db", - CardDir: "./data", - CardInfo: "package.json", + DbPath: "./data/data.db", + CardDir: "./data", + CardInfo: "package.json", + Avatar: "./data/avatar", + ZeroconfKey: "work_cations_service", + ZeroconfPort: 16800, + ServerAddr: ":16800", } func init() { defer func() { _ = os.Mkdir(T.CardDir, os.ModeDir) + _ = os.Mkdir(T.Avatar, os.ModeDir) }() cfg, err := ini.Load("conf.ini") if err != nil { diff --git a/go.mod b/go.mod index 6c4b2be..63d3df2 100644 --- a/go.mod +++ b/go.mod @@ -18,40 +18,66 @@ require ( fyne.io/systray v1.11.0 // indirect github.com/BurntSushi/toml v1.4.0 // indirect github.com/TheTitanrain/w32 v0.0.0-20180517000239-4f5cfb03fabf // indirect + github.com/bytedance/sonic v1.12.3 // indirect + github.com/bytedance/sonic/loader v0.2.0 // indirect + github.com/cenkalti/backoff v2.2.1+incompatible // indirect + github.com/cloudwego/base64x v0.1.4 // indirect + github.com/cloudwego/iasm v0.2.0 // indirect github.com/davecgh/go-spew v1.1.1 // indirect github.com/fredbi/uri v1.1.0 // indirect github.com/fsnotify/fsnotify v1.7.0 // indirect github.com/fyne-io/gl-js v0.0.0-20220119005834-d2da28d9ccfe // indirect github.com/fyne-io/glfw-js v0.0.0-20240101223322-6e1efdc71b7a // indirect github.com/fyne-io/image v0.0.0-20220602074514-4956b0afb3d2 // indirect + github.com/gabriel-vasile/mimetype v1.4.5 // indirect + github.com/gin-contrib/sse v0.1.0 // indirect + github.com/gin-gonic/gin v1.10.0 // indirect github.com/go-gl/gl v0.0.0-20211210172815-726fda9656d6 // indirect github.com/go-gl/glfw/v3.3/glfw v0.0.0-20240506104042-037f3cc74f2a // indirect + github.com/go-playground/locales v0.14.1 // indirect + github.com/go-playground/universal-translator v0.18.1 // indirect + github.com/go-playground/validator/v10 v10.22.1 // indirect github.com/go-sql-driver/mysql v1.7.0 // indirect github.com/go-text/render v0.1.1-0.20240418202334-dd62631dae9b // indirect github.com/go-text/typesetting v0.1.0 // indirect + github.com/goccy/go-json v0.10.3 // indirect github.com/godbus/dbus/v5 v5.1.0 // indirect github.com/gopherjs/gopherjs v1.17.2 // indirect + github.com/grandcat/zeroconf v1.0.0 // indirect github.com/jeandeaual/go-locale v0.0.0-20240223122105-ce5225dcaa49 // indirect github.com/jinzhu/inflection v1.0.0 // indirect github.com/jinzhu/now v1.1.5 // indirect github.com/jonboulle/clockwork v0.4.0 // indirect + github.com/json-iterator/go v1.1.12 // indirect github.com/jsummers/gobmp v0.0.0-20151104160322-e2ba15ffa76e // indirect + github.com/klauspost/cpuid/v2 v2.2.8 // indirect + github.com/leodido/go-urn v1.4.0 // indirect github.com/lestrrat-go/strftime v1.1.0 // indirect + github.com/mattn/go-isatty v0.0.20 // indirect github.com/mattn/go-sqlite3 v1.14.22 // indirect + github.com/miekg/dns v1.1.27 // indirect + github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect + github.com/modern-go/reflect2 v1.0.2 // indirect github.com/nicksnyder/go-i18n/v2 v2.4.0 // indirect - github.com/pkg/errors v0.8.1 // indirect + github.com/pelletier/go-toml/v2 v2.2.3 // indirect + github.com/pkg/errors v0.9.1 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect github.com/rymdport/portal v0.2.6 // indirect github.com/sqweek/dialog v0.0.0-20240226140203-065105509627 // indirect github.com/srwiley/oksvg v0.0.0-20221011165216-be6e8873101c // indirect github.com/srwiley/rasterx v0.0.0-20220730225603-2ab79fcdd4ef // indirect - github.com/stretchr/testify v1.8.4 // indirect + github.com/stretchr/testify v1.9.0 // indirect + github.com/twitchyliquid64/golang-asm v0.15.1 // indirect + github.com/ugorji/go/codec v1.2.12 // indirect github.com/yuin/goldmark v1.7.1 // indirect + golang.org/x/arch v0.11.0 // indirect + golang.org/x/crypto v0.28.0 // indirect golang.org/x/image v0.18.0 // indirect golang.org/x/mobile v0.0.0-20231127183840-76ac6878050a // indirect - golang.org/x/net v0.25.0 // indirect - golang.org/x/sys v0.20.0 // indirect - golang.org/x/text v0.16.0 // indirect + golang.org/x/net v0.30.0 // indirect + golang.org/x/sys v0.26.0 // indirect + golang.org/x/text v0.19.0 // indirect + google.golang.org/protobuf v1.35.1 // indirect gopkg.in/ini.v1 v1.67.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/go.sum b/go.sum index 25c612f..0deb3c5 100644 --- a/go.sum +++ b/go.sum @@ -55,11 +55,22 @@ github.com/atotto/clipboard v0.1.4 h1:EH0zSVneZPSuFR11BlR9YppQTVDbh5+16AmcJi4g1z github.com/atotto/clipboard v0.1.4/go.mod h1:ZY9tmq7sm5xIbd9bOK4onWV4S6X0u6GY7Vn0Yu86PYI= github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= github.com/bketelsen/crypt v0.0.4/go.mod h1:aI6NrJ0pMGgvZKL1iVgXLnfIFJtfV+bKCoqOes/6LfM= +github.com/bytedance/sonic v1.12.3 h1:W2MGa7RCU1QTeYRTPE3+88mVC0yXmsRQRChiyVocVjU= +github.com/bytedance/sonic v1.12.3/go.mod h1:B8Gt/XvtZ3Fqj+iSKMypzymZxw/FVwgIGKzMzT9r/rk= +github.com/bytedance/sonic/loader v0.1.1/go.mod h1:ncP89zfokxS5LZrJxl5z0UJcsk4M4yY2JpfqGeCtNLU= +github.com/bytedance/sonic/loader v0.2.0 h1:zNprn+lsIP06C/IqCHs3gPQIvnvpKbbxyXQP1iU4kWM= +github.com/bytedance/sonic/loader v0.2.0/go.mod h1:ncP89zfokxS5LZrJxl5z0UJcsk4M4yY2JpfqGeCtNLU= +github.com/cenkalti/backoff v2.2.1+incompatible h1:tNowT99t7UNflLxfYYSlKYsBpXdEet03Pg2g16Swow4= +github.com/cenkalti/backoff v2.2.1+incompatible/go.mod h1:90ReRw6GdpyfrHakVjL/QHaoyV4aDUVVkXQJJJ3NXXM= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= +github.com/cloudwego/base64x v0.1.4 h1:jwCgWpFanWmN8xoIUHa2rtzmkd5J2plF/dnLS6Xd/0Y= +github.com/cloudwego/base64x v0.1.4/go.mod h1:0zlkT4Wn5C6NdauXdJRhSKRlJvmclQ1hhJgA0rcu/8w= +github.com/cloudwego/iasm v0.2.0 h1:1KNIy1I1H9hNNFEEH3DVnI4UujN+1zjpuk6gwHLTssg= +github.com/cloudwego/iasm v0.2.0/go.mod h1:8rXZaNYT2n95jn+zTI1sDr+IgcD2GVs0nlbbQPiEFhY= 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= @@ -90,7 +101,13 @@ github.com/fyne-io/glfw-js v0.0.0-20240101223322-6e1efdc71b7a h1:ybgRdYvAHTn93HW github.com/fyne-io/glfw-js v0.0.0-20240101223322-6e1efdc71b7a/go.mod h1:gsGA2dotD4v0SR6PmPCYvS9JuOeMwAtmfvDE7mbYXMY= github.com/fyne-io/image v0.0.0-20220602074514-4956b0afb3d2 h1:hnLq+55b7Zh7/2IRzWCpiTcAvjv/P8ERF+N7+xXbZhk= github.com/fyne-io/image v0.0.0-20220602074514-4956b0afb3d2/go.mod h1:eO7W361vmlPOrykIg+Rsh1SZ3tQBaOsfzZhsIOb/Lm0= +github.com/gabriel-vasile/mimetype v1.4.5 h1:J7wGKdGu33ocBOhGy0z653k/lFKLFDPJMG8Gql0kxn4= +github.com/gabriel-vasile/mimetype v1.4.5/go.mod h1:ibHel+/kbxn9x2407k1izTA1S81ku1z/DlgOW2QE0M4= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= +github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE= +github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI= +github.com/gin-gonic/gin v1.10.0 h1:nTuyha1TYqgedzytsKYqna+DfLos46nTv2ygFy86HFU= +github.com/gin-gonic/gin v1.10.0/go.mod h1:4PMNQiOhvDRa013RKVbsiNwoyezlm2rm0uX/T7kzp5Y= github.com/go-gl/gl v0.0.0-20211210172815-726fda9656d6 h1:zDw5v7qm4yH7N8C8uWd+8Ii9rROdgWxQuGoJ9WDXxfk= github.com/go-gl/gl v0.0.0-20211210172815-726fda9656d6/go.mod h1:9YTyiznxEY1fVinfM7RvRcjRHbw2xLBJ3AAGIT0I4Nw= github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= @@ -98,6 +115,12 @@ github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2 github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20240506104042-037f3cc74f2a h1:vxnBhFDDT+xzxf1jTJKMKZw3H0swfWk9RpWbBbDK5+0= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20240506104042-037f3cc74f2a/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= +github.com/go-playground/locales v0.14.1 h1:EWaQ/wswjilfKLTECiXz7Rh+3BjFhfDFKv/oXslEjJA= +github.com/go-playground/locales v0.14.1/go.mod h1:hxrqLVvrK65+Rwrd5Fc6F2O76J/NuW9t0sjnWqG1slY= +github.com/go-playground/universal-translator v0.18.1 h1:Bcnm0ZwsGyWbCzImXv+pAJnYK9S473LQFuzCbDbfSFY= +github.com/go-playground/universal-translator v0.18.1/go.mod h1:xekY+UJKNuX9WP91TpwSH2VMlDf28Uj24BCp08ZFTUY= +github.com/go-playground/validator/v10 v10.22.1 h1:40JcKH+bBNGFczGuoBYgX4I6m/i27HYW8P9FDk5PbgA= +github.com/go-playground/validator/v10 v10.22.1/go.mod h1:dbuPbCMFw/DrkbEynArYaCwl3amGuJotoKCe95atGMM= github.com/go-sql-driver/mysql v1.7.0 h1:ueSltNNllEqE3qcWBTD0iQd3IpL/6U+mJxLkazJ7YPc= github.com/go-sql-driver/mysql v1.7.0/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI= github.com/go-text/render v0.1.1-0.20240418202334-dd62631dae9b h1:daoFn+Aw8EIQZO9kYWwHL01FqwwpCl2nTeVEYbsgRHk= @@ -106,6 +129,8 @@ github.com/go-text/typesetting v0.1.0 h1:vioSaLPYcHwPEPLT7gsjCGDCoYSbljxoHJzMnKw github.com/go-text/typesetting v0.1.0/go.mod h1:d22AnmeKq/on0HNv73UFriMKc4Ez6EqZAofLhAzpSzI= github.com/go-text/typesetting-utils v0.0.0-20240329101916-eee87fb235a3 h1:levTnuLLUmpavLGbJYLJA7fQnKeS7P1eCdAlM+vReXk= github.com/go-text/typesetting-utils v0.0.0-20240329101916-eee87fb235a3/go.mod h1:DDxDdQEnB70R8owOx3LVpEFvpMK9eeH1o2r0yZhFI9o= +github.com/goccy/go-json v0.10.3 h1:KZ5WoDbxAIgm2HNbYckL0se1fHD6rz5j4ywS6ebzDqA= +github.com/goccy/go-json v0.10.3/go.mod h1:oq7eo15ShAhp70Anwd5lgX2pLfOS3QCiwU/PULtXL6M= github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/godbus/dbus/v5 v5.1.0 h1:4KLkAxT3aOY8Li4FRJe/KvhoNFFxo0m6fNuFUO8QJUk= github.com/godbus/dbus/v5 v5.1.0/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= @@ -181,6 +206,8 @@ github.com/gopherjs/gopherjs v0.0.0-20211219123610-ec9572f70e60/go.mod h1:cz9oNY github.com/gopherjs/gopherjs v1.17.2 h1:fQnZVsXk8uxXIStYb0N4bGk7jeyTalG/wsZjQ25dO0g= github.com/gopherjs/gopherjs v1.17.2/go.mod h1:pRRIvn/QzFLrKfvEz3qUuEhtE/zLCWfreZ6J5gM2i+k= github.com/goxjs/gl v0.0.0-20210104184919-e3fafc6f8f2a/go.mod h1:dy/f2gjY09hwVfIyATps4G2ai7/hLwLkc5TrPqONuXY= +github.com/grandcat/zeroconf v1.0.0 h1:uHhahLBKqwWBV6WZUDAT71044vwOTL+McW0mBJvo6kE= +github.com/grandcat/zeroconf v1.0.0/go.mod h1:lTKmG1zh86XyCoUeIHSA4FJMBwCJiQmGfcP2PdzytEs= github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= github.com/hashicorp/consul/api v1.1.0/go.mod h1:VmuI/Lkw1nC05EYQWNKwWGbkg+FbDBtguAZLlVdkD9Q= github.com/hashicorp/consul/sdk v0.1.1/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= @@ -214,6 +241,8 @@ github.com/jinzhu/now v1.1.5/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/ github.com/jonboulle/clockwork v0.4.0 h1:p4Cf1aMWXnXAUh8lVfewRBx1zaTSYKrKMF2g3ST4RZ4= github.com/jonboulle/clockwork v0.4.0/go.mod h1:xgRqUGwRcjKCO1vbZUEtSLrqKoPSsUpK7fnezOII0kc= github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= +github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= github.com/jsummers/gobmp v0.0.0-20151104160322-e2ba15ffa76e h1:LvL4XsI70QxOGHed6yhQtAU34Kx3Qq2wwBzGFKY8zKk= @@ -221,11 +250,17 @@ github.com/jsummers/gobmp v0.0.0-20151104160322-e2ba15ffa76e/go.mod h1:kLgvv7o6U github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= 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/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= +github.com/klauspost/cpuid/v2 v2.2.8 h1:+StwCXwm9PdpiEkPyzBXIy+M9KUb4ODm0Zarf1kS5BM= +github.com/klauspost/cpuid/v2 v2.2.8/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws= +github.com/knz/go-libedit v1.10.1/go.mod h1:MZTVkCWyz0oBc7JOWP3wNAzd002ZbM/5hgShxwh4x8M= github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= +github.com/leodido/go-urn v1.4.0 h1:WT9HwE9SGECu3lg4d/dIA+jxlljEa1/ffXKmRjqdmIQ= +github.com/leodido/go-urn v1.4.0/go.mod h1:bvxc+MVxLKB4z00jd1z+Dvzr47oO32F/QSNjSBOlFxI= github.com/lestrrat-go/envload v0.0.0-20180220234015-a3eb8ddeffcc h1:RKf14vYWi2ttpEmkA4aQ3j4u9dStX2t4M8UM6qqNsG8= github.com/lestrrat-go/envload v0.0.0-20180220234015-a3eb8ddeffcc/go.mod h1:kopuH9ugFRkIXf3YoqHKyrJ9YfUFsckUU9S7B+XP+is= github.com/lestrrat-go/file-rotatelogs v2.4.0+incompatible h1:Y6sqxHMyB1D2YSzWkLibYKgg+SwmyFU9dF2hn6MdTj4= @@ -235,9 +270,13 @@ github.com/lestrrat-go/strftime v1.1.0/go.mod h1:uzeIB52CeUJenCo1syghlugshMysrqU github.com/magiconair/properties v1.8.5/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60= github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= +github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= +github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= github.com/mattn/go-sqlite3 v1.14.22 h1:2gZY6PC6kBnID23Tichd1K+Z0oS6nE/XwU+Vz/5o4kU= github.com/mattn/go-sqlite3 v1.14.22/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= +github.com/miekg/dns v1.1.27 h1:aEH/kqUzUxGJ/UHcEKdJY+ugH6WEzsEBBSPa8zuy1aM= +github.com/miekg/dns v1.1.27/go.mod h1:KNUDUusw/aVsxyTYZM1oqvCicbwhgbNgztCETuNZ7xM= github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI= @@ -247,8 +286,12 @@ github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:F github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= +github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= +github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= github.com/neelance/astrewrite v0.0.0-20160511093645-99348263ae86/go.mod h1:kHJEU3ofeGjhHklVoIGuVj85JJwZ6kWPaJwCIxgnFmo= github.com/neelance/sourcemap v0.0.0-20200213170602-2833bce08e4c/go.mod h1:Qr6/a/Q4r9LP1IltGz7tA7iOK1WonHEYhu1HRBA7ZiM= github.com/nicksnyder/go-i18n/v2 v2.4.0 h1:3IcvPOAvnCKwNm0TB0dLDTuawWEj+ax/RERNC+diLMM= @@ -256,9 +299,13 @@ github.com/nicksnyder/go-i18n/v2 v2.4.0/go.mod h1:nxYSZE9M0bf3Y70gPQjN9ha7XNHX7g github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e h1:fD57ERR4JtEqsWbfPhv4DMiApHyliiK5xCTNVSPiaAs= github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= +github.com/pelletier/go-toml v1.9.3 h1:zeC5b1GviRUyKYd6OJPvBU/mcVDVoL1OhT17FCt5dSQ= github.com/pelletier/go-toml v1.9.3/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= +github.com/pelletier/go-toml/v2 v2.2.3 h1:YmeHyLY8mFWbdkNWwpr+qIL2bEqT0o95WSdkNHvL12M= +github.com/pelletier/go-toml/v2 v2.2.3/go.mod h1:MfCQTFTvCcUyyvvwm1+G6H/jORL20Xlb6rzQu9GuUkc= github.com/pkg/errors v0.8.1 h1:iURUrRGxPUNPdy5/HRSm+Yj6okJ6UtLINN0Q9M4+h3I= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/profile v1.7.0 h1:hnbDkaNWPCLMO9wGLdBFTIZvzDrDfBM2072E1S9gJkA= github.com/pkg/profile v1.7.0/go.mod h1:8Uer0jas47ZQMJ7VD+OHknK4YDY07LPUC6dEvqDjvNo= github.com/pkg/sftp v1.10.1/go.mod h1:lYOWFsE0bwd1+KfKJaKeuokY15vzFx25BLbzYYoAxZI= @@ -296,6 +343,9 @@ github.com/srwiley/oksvg v0.0.0-20221011165216-be6e8873101c/go.mod h1:cNQ3dwVJtS github.com/srwiley/rasterx v0.0.0-20220730225603-2ab79fcdd4ef h1:Ch6Q+AZUxDBCVqdkI8FSpFyZDtCVBc2VmejdNrm5rRQ= github.com/srwiley/rasterx v0.0.0-20220730225603-2ab79fcdd4ef/go.mod h1:nXTWP6+gD5+LUJ8krVhhoeHjvHTutPxMYl5SvkcnJNE= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= +github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= +github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= @@ -303,9 +353,16 @@ github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5 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.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= +github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= +github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= +github.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI= +github.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08= +github.com/ugorji/go/codec v1.2.12 h1:9LC83zGrHhuUA9l16C9AHXAqEV/2wBQ4nkvumAE65EE= +github.com/ugorji/go/codec v1.2.12/go.mod h1:UNopzCgEMSXjBc6AOMqYvWC1ktqTAfzJZUZgYf6w6lg= github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= @@ -327,6 +384,8 @@ go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= 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/arch v0.11.0 h1:KXV8WWKCXm6tRpLirl2szsO5j/oOODwZf4hATmGVNs4= +golang.org/x/arch v0.11.0/go.mod h1:FEVrYAQjsQXMVJ1nsMoVVXPZg6p2JE2mx8psSWTDQys= golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= @@ -335,6 +394,10 @@ golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8U golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.23.0 h1:dIJU/v2J8Mdglj/8rJ6UUOM3Zc9zLZxVZwwxMooUSAI= +golang.org/x/crypto v0.23.0/go.mod h1:CKFgDieR+mRhux2Lsu27y0fO304Db0wZe70UKqHu0v8= +golang.org/x/crypto v0.28.0 h1:GBDwsMXVQi34v5CCYUm2jkJvu4cbtru2U4TN2PSyQnw= +golang.org/x/crypto v0.28.0/go.mod h1:rmgy+3RHxRZMyY0jjAJShp2zgEdOqj2AO7U0pYmeQ7U= 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= @@ -390,6 +453,7 @@ golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= @@ -415,6 +479,8 @@ golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96b golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.25.0 h1:d/OCCoBEUq33pjydKrGQhw7IlUPI2Oylr+8qLx49kac= golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM= +golang.org/x/net v0.30.0 h1:AcW1SDZMkb8IpzCdQUaIq2sP4sZ4zw+55h6ynffypl4= +golang.org/x/net v0.30.0/go.mod h1:2wGyMJ5iFasEhkwi13ChkO/t1ECNC4X4eBKkVFyYFlU= 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= @@ -449,6 +515,7 @@ golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -484,8 +551,12 @@ golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210809222454-d867a43fc93e/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.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y= golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.26.0 h1:KHjCJyddX0LoSTb3J+vWpupP9p0oznkqVk/IfjymZbo= +golang.org/x/sys v0.26.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= 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= @@ -497,6 +568,8 @@ golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.16.0 h1:a94ExnEXNtEwYLGJSIUxnWoxoRz/ZcCsV63ROupILh4= golang.org/x/text v0.16.0/go.mod h1:GhwF1Be+LQoKShO3cGOHzqOgRrGaYc9AvblQOmPVHnI= +golang.org/x/text v0.19.0 h1:kTxAhCbGbxhK0IwgSKiMO5awPoDQ0RpfiVYBfK860YM= +golang.org/x/text v0.19.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY= 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= @@ -522,6 +595,7 @@ golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtn golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191216052735-49a3e744a425/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= @@ -659,6 +733,8 @@ google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGj google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= 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.35.1 h1:m3LfL6/Ca+fqnjnlqQXNpFPABW1UD7mjh8KO2mKFytA= +google.golang.org/protobuf v1.35.1/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= 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= gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f h1:BLraFXnmrev5lT+xlilqcH8XK9/i0At2xKjWk4p6zsU= @@ -690,6 +766,8 @@ honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWh honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= +nullprogram.com/x/optparse v1.0.0/go.mod h1:KdyPE+Igbe0jQUrVfMqDMeJQIJZEuyV7pjYmp6pbG50= rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= +rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4= rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= diff --git a/main.go b/main.go index c66d7cc..46e45f3 100644 --- a/main.go +++ b/main.go @@ -21,7 +21,7 @@ func main() { a := app.NewWithID("io.fyne.workCation") a.Settings().SetTheme(&assets.MyTheme{}) a.SetIcon(assets.LogoDataSR) - w := a.NewWindow("主页 " + version.NowVersion) + w := a.NewWindow("开发小工具 " + version.NowVersion) w.Resize(fyne.NewSize(800, 550)) w.SetContent(mainView(w)) w.CenterOnScreen() diff --git a/models/execFiles.go b/models/execFilesCards.go similarity index 100% rename from models/execFiles.go rename to models/execFilesCards.go diff --git a/models/online.go b/models/online.go new file mode 100644 index 0000000..ac31b28 --- /dev/null +++ b/models/online.go @@ -0,0 +1,48 @@ +package models + +import ( + "errors" + "github.com/grandcat/zeroconf" + "net" +) + +// Online 在线数据 +type Online struct { + AddrIPv4 []net.IP `json:"-"` // Host machine IPv4 address + AddrIPv6 []net.IP `json:"-"` + Port int `json:"port"` + ID string `json:"id"` + Name string `json:"name"` // 昵称 + Avatar string `json:"avatar"` // 头像 + Email string `json:"email"` + Phone string `json:"phone"` + Address string `json:"address"` // 工位 +} + +func UserTOnlineList(user *Users) []string { + return []string{ + user.ID, + user.Name, + user.Avatar, + user.Email, + user.Phone, + user.Address, + } +} + +func NewOnline(entry *zeroconf.ServiceEntry) (*Online, error) { + if len(entry.Text) != 6 { + return nil, errors.New("invalid online entry") + } + return &Online{ + AddrIPv4: entry.AddrIPv4, + AddrIPv6: entry.AddrIPv6, + Port: entry.Port, + ID: entry.Text[0], + Name: entry.Text[1], + Avatar: entry.Text[2], + Email: entry.Text[3], + Phone: entry.Text[4], + Address: entry.Text[5], + }, nil +} diff --git a/models/user.go b/models/user.go index 051c218..dc5d736 100644 --- a/models/user.go +++ b/models/user.go @@ -8,5 +8,5 @@ type Users struct { Cover string `json:"cover"` // 封面 Email string `json:"email"` Phone string `json:"phone"` - Address string `json:"address"` + Address string `json:"address"` // 工位 } diff --git a/repo/user.go b/repo/user.go index d551901..e3d980d 100644 --- a/repo/user.go +++ b/repo/user.go @@ -25,7 +25,6 @@ func (*userRepo) GetUserInfo(db *gorm.DB) *models.Users { ID: utils.Uuid.CreateUUID(), Ip: ip, Name: current.Username, - Avatar: "", Cover: "", Email: "", Phone: "", @@ -35,3 +34,7 @@ func (*userRepo) GetUserInfo(db *gorm.DB) *models.Users { } return &users } + +func (*userRepo) Update(db *gorm.DB, newUser *models.Users) error { + return db.Model(&models.Users{}).Where("ID = ?", newUser.ID).Updates(newUser).Error +} diff --git a/service/server.go b/service/server.go new file mode 100644 index 0000000..fed846b --- /dev/null +++ b/service/server.go @@ -0,0 +1,72 @@ +package service + +import ( + "errors" + "github.com/gin-gonic/gin" + "log" + "net/http" + "work_cation/cfg" + "work_cation/global" + "work_cation/repo" +) + +type serverService struct { + Status string + server *http.Server +} + +const ( + StatusOnline = "online" + StatusOffline = "offline" +) + +var Server = &serverService{Status: StatusOffline} + +func (s *serverService) Online() error { + if s.Status == StatusOnline { + return nil + } + // 启动服务发现 + user := repo.User.GetUserInfo(global.DB) + if err := Zeroconf.Register(user); err != nil { + return err + } + // 启动服务 + if err := s.StartListenServer(); err != nil { + return err + } + // 修改状态 + s.Status = StatusOnline + return nil +} + +func (s *serverService) StatusOffline() error { + if err := s.server.Close(); err != nil { + return err + } + // 关闭服务发现 + Zeroconf.Close() + // 修改状态 + s.Status = StatusOffline + return nil +} + +func (s *serverService) StartListenServer() error { + router := gin.New() + router.GET("/", func(c *gin.Context) { + c.JSON(200, gin.H{"message": "hello"}) + }) + + srv := &http.Server{ + Addr: cfg.T.ServerAddr, + Handler: router, + } + + go func() { + if err := srv.ListenAndServe(); err != nil && !errors.Is(err, http.ErrServerClosed) { + log.Fatalf("listen: %s\n", err) + } + }() + s.server = srv + return nil +} diff --git a/service/zeroconf.go b/service/zeroconf.go new file mode 100644 index 0000000..5438998 --- /dev/null +++ b/service/zeroconf.go @@ -0,0 +1,68 @@ +package service + +import ( + "context" + "fmt" + "github.com/grandcat/zeroconf" + "time" + "work_cation/cfg" + "work_cation/models" +) + +type zeroconfService struct { + server *zeroconf.Server +} + +var Zeroconf = &zeroconfService{} + +// Register 注册被发现服务 +func (s *zeroconfService) Register(user *models.Users) error { + if s.server != nil { + return nil // already registered + } + server, err := zeroconf.Register(cfg.T.ZeroconfKey, "_http._tcp", + "local.", cfg.T.ZeroconfPort, models.UserTOnlineList(user), nil) + if err != nil { + return err + } + s.server = server + return nil +} + +func (s *zeroconfService) Close() { + if s.server != nil { + s.server.Shutdown() + s.server = nil + } +} + +// FindService 查找被发现服务 +func (s *zeroconfService) FindService() (chan *models.Online, error) { + resolver, err := zeroconf.NewResolver(nil) + if err != nil { + return nil, err + } + allEntries := make(chan *zeroconf.ServiceEntry) + useEntries := make(chan *models.Online) + + go func(results <-chan *zeroconf.ServiceEntry) { + for entry := range results { + if entry.ServiceInstanceName() == fmt.Sprintf("%s._http._tcp.local.", cfg.T.ZeroconfKey) { + //fmt.Printf("发现服务: %s \nIP:%s:%d \nInfo: %v\n", entry.ServiceInstanceName(), entry.AddrIPv4, entry.Port, entry.Text) + online, err := models.NewOnline(entry) + if err != nil { + continue + } + useEntries <- online + } + } + }(allEntries) + ctx, cancel := context.WithCancel(context.Background()) + err = resolver.Browse(ctx, "_http._tcp", "local.", allEntries) + if err != nil { + cancel() + return nil, err + } + time.AfterFunc(10*time.Second, cancel) + return useEntries, nil +} diff --git a/views/userView.go b/views/userView.go index 49130f6..e63a85c 100644 --- a/views/userView.go +++ b/views/userView.go @@ -1,32 +1,101 @@ package views import ( + "fmt" "fyne.io/fyne/v2" "fyne.io/fyne/v2/canvas" "fyne.io/fyne/v2/container" + "fyne.io/fyne/v2/data/binding" + "fyne.io/fyne/v2/dialog" + "fyne.io/fyne/v2/theme" "fyne.io/fyne/v2/widget" + "os" + "path/filepath" + "time" "work_cation/assets" + "work_cation/cfg" "work_cation/global" + "work_cation/models" + "work_cation/pkg/utils" "work_cation/repo" ) -func mainUserViews(w fyne.Window) fyne.CanvasObject { - image := canvas.NewImageFromResource(assets.LogoDataSR) - image.FillMode = canvas.ImageFillContain - - user := repo.User.GetUserInfo(global.DB) - - userCard := widget.NewCard( - user.Name, - user.Ip, - nil) - userCard.SetImage(image) - - return container.NewBorder(nil, +func mainUserViews(_ fyne.Window) fyne.CanvasObject { + var userCard = widget.NewCard("", "", nil) + user1 := repo.User.GetUserInfo(global.DB) + refresh := func(user *models.Users) { + userCard.SetTitle(user.Name) + userCard.SetSubTitle(user.Ip) + image := canvas.NewImageFromResource(assets.LogoDataSR) + if user.Avatar != "" { + bytes, err := os.ReadFile(filepath.Join(cfg.T.Avatar, user.Avatar)) + if err == nil { + image.Resource = fyne.NewStaticResource("", bytes) + } + } + image.FillMode = canvas.ImageFillContain + userCard.SetImage(image) + } + refresh(user1) + return container.NewBorder(widget.NewToolbar(widget.NewToolbarAction(theme.SettingsIcon(), func() { + mainUserSetWin(refresh) + })), nil, nil, nil, userCard, ) - +} + +func mainUserSetWin(refresh func(*models.Users)) { + myApp := fyne.CurrentApp() + myWindow := myApp.NewWindow("设置个人信息") + myWindow.CenterOnScreen() + myWindow.Resize(fyne.NewSize(500, 0)) + myWindow.SetContent(mainUserSetView(myWindow, refresh)) + myWindow.Show() +} + +func mainUserSetView(w fyne.Window, refresh func(*models.Users)) fyne.CanvasObject { + var ( + formWid = widget.NewForm() + user = repo.User.GetUserInfo(global.DB) + avatar = "" + ) + formWid.SubmitText = "保存" + formWid.OnSubmit = func() { + if avatar != "" { + avatarPath := fmt.Sprintf("%s_avatar%s", user.ID, filepath.Ext(avatar)) + // 删除旧的 + if user.Avatar != "" { + err := os.Remove(filepath.Join(cfg.T.Avatar, user.Avatar)) + if err != nil { + dialog.ShowInformation("原头像删除错误", err.Error(), w) + } + } + // 拷贝文件 + err := utils.File.CopyFile(avatar, filepath.Join(cfg.T.Avatar, avatarPath)) + if err != nil { + dialog.ShowInformation("头像地址错误", err.Error(), w) + return + } + avatar = "" + user.Avatar = avatarPath + } + err := repo.User.Update(global.DB, user) + if err != nil { + dialog.ShowInformation("保存失败", err.Error(), w) + return + } + dialog.ShowInformation("结果", "保存成功", w) + refresh(user) + time.AfterFunc(200*time.Millisecond, w.Close) + } + formWid.Append("用户名", widget.NewEntryWithData(binding.BindString(&user.Name))) + formWid.Append("头像", widget.NewEntryWithData(binding.BindString(&avatar))) + formWid.Append("邮箱", widget.NewEntryWithData(binding.BindString(&user.Email))) + formWid.Append("电话", widget.NewEntryWithData(binding.BindString(&user.Phone))) + formWid.Append("工位", widget.NewEntryWithData(binding.BindString(&user.Address))) + + return formWid }