From 31a5b7548996e214594b035add420d8333540749 Mon Sep 17 00:00:00 2001 From: Jiang-Red <79574799+Jiang-Red@users.noreply.github.com> Date: Mon, 16 Oct 2023 13:50:10 +0000 Subject: [PATCH 1/5] add score plugin --- go.mod | 21 ++- go.sum | 67 +++++++-- main.go | 1 + plugin/score/draw.go | 237 +++++++++++++++++++++++++++++++ plugin/score/model.go | 135 ++++++++++++++++++ plugin/score/sign_in.go | 306 ++++++++++++++++++++++++++++++++++++++++ 6 files changed, 751 insertions(+), 16 deletions(-) create mode 100644 plugin/score/draw.go create mode 100644 plugin/score/model.go create mode 100644 plugin/score/sign_in.go diff --git a/go.mod b/go.mod index fce6ce5..2833dcb 100644 --- a/go.mod +++ b/go.mod @@ -5,15 +5,19 @@ go 1.20 require ( github.com/FloatTech/AnimeAPI v1.6.1-0.20231016040616-78f012eba395 github.com/FloatTech/floatbox v0.0.0-20230827160415-f0865337a824 - github.com/FloatTech/gg v1.1.2 - github.com/FloatTech/imgfactory v0.2.2-0.20230315152233-49741fc994f9 + github.com/FloatTech/gg v1.1.3-0.20230226151425-6ea91286ba08 + github.com/FloatTech/imgfactory v0.2.2-0.20230413152719-e101cc3606ef + github.com/FloatTech/rendercard v0.0.10-0.20230223064326-45d29fa4ede9 github.com/FloatTech/zbpctrl v1.5.3-0.20230514154630-b74e6fcca380 github.com/FloatTech/zbputils v1.6.2-0.20231004125426-3f1ffcf78f51 + github.com/disintegration/imaging v1.6.2 github.com/fumiama/NanoBot v0.0.0-20231016070353-5314405eeb9e github.com/fumiama/go-base16384 v1.7.0 github.com/fumiama/unibase2n v0.0.0-20221020155353-02876e777430 github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0 + github.com/jinzhu/gorm v1.9.16 github.com/sirupsen/logrus v1.9.3 + github.com/wcharczuk/go-chart/v2 v2.1.1 github.com/wdvxdr1123/ZeroBot v1.7.4 ) @@ -22,7 +26,7 @@ require ( github.com/FloatTech/ttl v0.0.0-20220715042055-15612be72f5b // indirect github.com/RomiChan/syncx v0.0.0-20221202055724-5f842c53020e // indirect github.com/RomiChan/websocket v1.4.3-0.20220227141055-9b2c6168c9c5 // indirect - github.com/disintegration/imaging v1.6.2 // indirect + github.com/blend/go-sdk v1.20220411.3 // indirect github.com/ericpauley/go-quantize v0.0.0-20200331213906-ae555eb2afa4 // indirect github.com/fumiama/cron v1.3.0 // indirect github.com/fumiama/go-registry v0.2.6 // indirect @@ -31,13 +35,18 @@ require ( github.com/fumiama/imgsz v0.0.2 // indirect github.com/fumiama/jieba v0.0.0-20221203025406-36c17a10b565 // indirect github.com/google/uuid v1.3.0 // indirect + github.com/jinzhu/inflection v1.0.0 // indirect github.com/mattn/go-isatty v0.0.16 // indirect github.com/pbnjay/memory v0.0.0-20210728143218-7b4eea64cf58 // indirect github.com/pkg/errors v0.9.1 // indirect github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0 // indirect - golang.org/x/image v0.3.0 // indirect - golang.org/x/sys v0.3.0 // indirect - golang.org/x/text v0.6.0 // indirect + github.com/tidwall/gjson v1.14.4 // indirect + github.com/tidwall/match v1.1.1 // indirect + github.com/tidwall/pretty v1.2.0 // indirect + golang.org/x/crypto v0.4.0 // indirect + golang.org/x/image v0.11.0 // indirect + golang.org/x/sys v0.8.0 // indirect + golang.org/x/text v0.12.0 // indirect modernc.org/libc v1.21.5 // indirect modernc.org/mathutil v1.5.0 // indirect modernc.org/memory v1.4.0 // indirect diff --git a/go.sum b/go.sum index 55dca08..8b2aa8b 100644 --- a/go.sum +++ b/go.sum @@ -2,10 +2,12 @@ github.com/FloatTech/AnimeAPI v1.6.1-0.20231016040616-78f012eba395 h1:wrUbBkP4q+ github.com/FloatTech/AnimeAPI v1.6.1-0.20231016040616-78f012eba395/go.mod h1:6vYu7bW5gPQsBnXB+I6yk+eJQaaAwusoQ/I/wQMwOAI= github.com/FloatTech/floatbox v0.0.0-20230827160415-f0865337a824 h1:w72fzQg1Y9+VLSRl7iKzaZ6fG3myyMJfpOSajcjaMDM= github.com/FloatTech/floatbox v0.0.0-20230827160415-f0865337a824/go.mod h1:FwQm6wk+b4wuW54KCKn3zccMX47Q5apnHD/Yakzv0fI= -github.com/FloatTech/gg v1.1.2 h1:YolgOYg3uDHc1+g0bLtt6QuRA/pvLn+b9IBCIhOOX88= -github.com/FloatTech/gg v1.1.2/go.mod h1:uzPzAeT35egARdRuu+1oyjU3CmTwCceoq3Vvje7LpcI= -github.com/FloatTech/imgfactory v0.2.2-0.20230315152233-49741fc994f9 h1:IzZLuM/fgKclyMaU/Qb1qlLdGrs2FTietkqOWhh07Gw= -github.com/FloatTech/imgfactory v0.2.2-0.20230315152233-49741fc994f9/go.mod h1:el5hGpj1C1bDRxcTXYRwEivDCr40zZeJpcrLrB1fajs= +github.com/FloatTech/gg v1.1.3-0.20230226151425-6ea91286ba08 h1:dPLeoiTVSBlgls+66EB/UJ2e38BaASmBN5nANaycSBU= +github.com/FloatTech/gg v1.1.3-0.20230226151425-6ea91286ba08/go.mod h1:uzPzAeT35egARdRuu+1oyjU3CmTwCceoq3Vvje7LpcI= +github.com/FloatTech/imgfactory v0.2.2-0.20230413152719-e101cc3606ef h1:CJbK/2FRwPuZpeb6M4sWK2d7oXDnBEGhpkQuQrgc91A= +github.com/FloatTech/imgfactory v0.2.2-0.20230413152719-e101cc3606ef/go.mod h1:el5hGpj1C1bDRxcTXYRwEivDCr40zZeJpcrLrB1fajs= +github.com/FloatTech/rendercard v0.0.10-0.20230223064326-45d29fa4ede9 h1:hffajvmQFfP68U6wUwHemPuuwCUoss+SEFfoLYwbGwE= +github.com/FloatTech/rendercard v0.0.10-0.20230223064326-45d29fa4ede9/go.mod h1:NBFPhWae4hqVMeG8ELBBnUQkKce3nDjkljVn6PdiUNs= github.com/FloatTech/sqlite v1.6.2 h1:FytbExjpvYalZxxITtmSenHiPGLPUvlz47LY/P0SCCw= github.com/FloatTech/sqlite v1.6.2/go.mod h1:zFbHzRfB+CJ+VidfjuVbrcin3DAz283F7hF1hIeHzpY= github.com/FloatTech/ttl v0.0.0-20220715042055-15612be72f5b h1:tvciXWq2nuvTbFeJGLDNIdRX3BI546D3O7k7vrVueZw= @@ -14,17 +16,25 @@ github.com/FloatTech/zbpctrl v1.5.3-0.20230514154630-b74e6fcca380 h1:qmwoT8xVaND github.com/FloatTech/zbpctrl v1.5.3-0.20230514154630-b74e6fcca380/go.mod h1:gkGC1C1eEUd/Ld/ja68zas5j2ZktIZCdnj2FMaM+Au0= github.com/FloatTech/zbputils v1.6.2-0.20231004125426-3f1ffcf78f51 h1:0Zn95bfPG+l33yUVgjlQgaCZBEedbmhF8S0sOQvozVo= github.com/FloatTech/zbputils v1.6.2-0.20231004125426-3f1ffcf78f51/go.mod h1:JRnGR7EGeEQgxOs+c0rZAhrS9Es2BTcGHdIDHXIPRzQ= +github.com/PuerkitoBio/goquery v1.5.1/go.mod h1:GsLWisAFVj4WgDibEWF4pvYnkVQBpKBKeU+7zCJoLcc= github.com/RomiChan/syncx v0.0.0-20221202055724-5f842c53020e h1:wR3MXQ3VbUlPKOOUwLOYgh/QaJThBTYtsl673O3lqSA= github.com/RomiChan/syncx v0.0.0-20221202055724-5f842c53020e/go.mod h1:vD7Ra3Q9onRtojoY5sMCLQ7JBgjUsrXDnDKyFxqpf9w= github.com/RomiChan/websocket v1.4.3-0.20220227141055-9b2c6168c9c5 h1:bBmmB7he0iVN4m5mcehfheeRUEer/Avo4ujnxI3uCqs= github.com/RomiChan/websocket v1.4.3-0.20220227141055-9b2c6168c9c5/go.mod h1:0UcFaCkhp6vZw6l5Dpq0Dp673CoF9GdvA8lTfst0GiU= +github.com/andybalholm/cascadia v1.1.0/go.mod h1:GsXiBklL0woXo1j/WYWtSYYC4ouU9PqHO0sqidkEA4Y= +github.com/blend/go-sdk v1.20220411.3 h1:GFV4/FQX5UzXLPwWV03gP811pj7B8J2sbuq+GJQofXc= +github.com/blend/go-sdk v1.20220411.3/go.mod h1:7lnH8fTi6U4i1fArEXRyOIY2E1X4MALg09qsQqY1+ak= 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= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/denisenkom/go-mssqldb v0.0.0-20191124224453-732737034ffd h1:83Wprp6ROGeiHFAP8WJdI2RoxALQYgdllERc3N5N2DM= +github.com/denisenkom/go-mssqldb v0.0.0-20191124224453-732737034ffd/go.mod h1:xbL0rPBG9cCiLr28tMa8zpbdarY27NDyej4t/EjAShU= github.com/disintegration/imaging v1.6.2 h1:w1LecBlG2Lnp8B3jk5zSuNqd7b4DXhcjwek1ei82L+c= github.com/disintegration/imaging v1.6.2/go.mod h1:44/5580QXChDfwIclfc/PCwrr44amcmDAg8hxG0Ewe4= github.com/ericpauley/go-quantize v0.0.0-20200331213906-ae555eb2afa4 h1:BBade+JlV/f7JstZ4pitd4tHhpN+w+6I+LyOS7B4fyU= github.com/ericpauley/go-quantize v0.0.0-20200331213906-ae555eb2afa4/go.mod h1:H7chHJglrhPPzetLdzBleF8d22WYOv7UM/lEKYiwlKM= +github.com/erikstmartin/go-testdb v0.0.0-20160219214506-8d10e4a1bae5 h1:Yzb9+7DPaBjB8zlTR87/ElzFsnQfuHnVUVqpZZIcV5Y= +github.com/erikstmartin/go-testdb v0.0.0-20160219214506-8d10e4a1bae5/go.mod h1:a2zkGnVExMxdzMo3M0Hi/3sEU+cWnZpSni0O6/Yb/P0= github.com/fumiama/NanoBot v0.0.0-20231016070353-5314405eeb9e h1:lYg7g8CbOpEucXGGdYannbhleho0Avatq0afdtr0fGE= github.com/fumiama/NanoBot v0.0.0-20231016070353-5314405eeb9e/go.mod h1:zUciPsZ7Vun5eLQucYohuj7VY4zEQm33406+3LtjJFc= github.com/fumiama/bigfft v0.0.0-20211011143303-6e0bfa3c836b h1:Zt3pFQditAdWTHCOVkiloc9ZauBoWrb37guFV4iIRvE= @@ -47,12 +57,27 @@ github.com/fumiama/sqlite3 v1.20.0-with-win386 h1:ZR1AXGBEtkfq9GAXehOVcwn+aaCG8i github.com/fumiama/sqlite3 v1.20.0-with-win386/go.mod h1:Os58MHwYCcYZCy2PGChBrQtBAw5/LS1ZZOkfc+C/I7s= github.com/fumiama/unibase2n v0.0.0-20221020155353-02876e777430 h1:XL4SnagpaVHYybnnj6whQxmt8Ps9/kaG6sCNn4X1GGA= github.com/fumiama/unibase2n v0.0.0-20221020155353-02876e777430/go.mod h1:lEaZsT4FRSqcjnQ5q8y+mkenkzR/r1D3BJmfdp0vqDg= +github.com/go-playground/assert/v2 v2.2.0 h1:JvknZsQTYeFEAhQwI4qEt9cyV5ONwRHC+lYKSsYSR8s= +github.com/go-sql-driver/mysql v1.5.0 h1:ozyZYNQW3x3HtqT1jira07DN2PArx2v7/mN66gGcHOs= +github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= +github.com/golang-sql/civil v0.0.0-20190719163853-cb61b32ac6fe h1:lXe2qZdvpiX5WZkZR4hgp4KJVfY3nMkvmwbVkpv1rVY= +github.com/golang-sql/civil v0.0.0-20190719163853-cb61b32ac6fe/go.mod h1:8vg3r2VgvsThLBIFL93Qb5yWzgyZWhEmBwUJWevAkK0= github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0 h1:DACJavvAHhabrF08vX0COfcOBJRhZ8lUbR+ZWIs0Y5g= github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k= github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/jinzhu/gorm v1.9.16 h1:+IyIjPEABKRpsu/F8OvDPy9fyQlgsg2luMV2ZIH5i5o= +github.com/jinzhu/gorm v1.9.16/go.mod h1:G3LB3wezTOWM2ITLzPxEXgSkOXAntiLHS7UdBefADcs= +github.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E= +github.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc= +github.com/jinzhu/now v1.0.1 h1:HjfetcXq097iXP0uoPCdnM4Efp5/9MsM0/M+XOTeR3M= +github.com/jinzhu/now v1.0.1/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8= +github.com/lib/pq v1.1.1 h1:sJZmqHoEaY7f+NPP8pgLB/WxulyR3fewgCM2qaSlBb4= +github.com/lib/pq v1.1.1/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= github.com/mattn/go-isatty v0.0.16 h1:bq3VjFmv/sOjHtdEhmkEV4x1AJtvUvOJ2PFAZ5+peKQ= github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= +github.com/mattn/go-sqlite3 v1.14.0 h1:mLyGNKR8+Vv9CAU7PphKa2hkEqxxhn8i32J6FPj1/QA= +github.com/mattn/go-sqlite3 v1.14.0/go.mod h1:JIl7NbARA7phWnGvh0LKTyg7S9BA+6gx71ShQilpsus= github.com/pbnjay/memory v0.0.0-20210728143218-7b4eea64cf58 h1:onHthvaw9LFnH4t2DcNVpwGmV9E1BkGknEliJkfwQj0= github.com/pbnjay/memory v0.0.0-20210728143218-7b4eea64cf58/go.mod h1:DXv8WO4yhMYhSNPKjeNKa5WY9YCIEBRbNzFFPJbWO6Y= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= @@ -66,41 +91,63 @@ github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/ github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.8.1 h1:w7B6lhMri9wdJUVmEZPGGhZzrYTPvgJArz7wNPgYKsk= github.com/tidwall/gjson v1.14.4 h1:uo0p8EbA09J7RQaflQ1aBRffTR7xedD2bcIVSYxLnkM= +github.com/tidwall/gjson v1.14.4/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 h1:RWIZEg2iJ8/g6fDDYzMpobmaoGh5OLl4AXtGUGPcqCs= +github.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU= +github.com/wcharczuk/go-chart/v2 v2.1.1 h1:2u7na789qiD5WzccZsFz4MJWOJP72G+2kUuJoSNqWnE= +github.com/wcharczuk/go-chart/v2 v2.1.1/go.mod h1:CyCAUt2oqvfhCl6Q5ZvAZwItgpQKZOkCJGb+VGv6l14= github.com/wdvxdr1123/ZeroBot v1.7.4 h1:+148rELpf/FCDW2EuvKqpb9bNKcwKRtoh16s2sIb5SE= github.com/wdvxdr1123/ZeroBot v1.7.4/go.mod h1:y29UIOy0RD3P+0meDNIWRhcJF3jtWPN9xP9hgt/AJAU= github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20190325154230-a5d413f7728c/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20191205180655-e7c4368fe9dd/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.4.0 h1:UVQgzMY87xqpKNgb+kDsll2Igd33HszWHFLmpaRMq/8= +golang.org/x/crypto v0.4.0/go.mod h1:3quD/ATkf6oY+rnes5c3ExXTbLc8mueNue5/DoinL80= golang.org/x/image v0.0.0-20191009234506-e7c1f5e7dbb8/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= -golang.org/x/image v0.3.0 h1:HTDXbdK9bjfSWkPzDJIw89W8CAtfFGduujWs33NLLsg= -golang.org/x/image v0.3.0/go.mod h1:fXd9211C/0VTlYuAcOhW8dY/RtEJqODXOWBDpmYBf+A= +golang.org/x/image v0.11.0 h1:ds2RoQvBvYTiJkwpSFDwCcDFNX7DqjL2WsUgTNk0Ooo= +golang.org/x/image v0.11.0/go.mod h1:bglhjqbqVuEb9e9+eNR45Jfu7D+T4Qan+NhQk8Ck2P8= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= +golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +golang.org/x/net v0.0.0-20180218175443-cbe0f9307d01/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.3.0 h1:w8ZOecv6NaNa/zC8944JTU3vz4u6Lagfk4RPQxv92NQ= -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.8.0 h1:EBmGv8NaZBZTWvrbjNoL6HVt+IVy3QDQpJs7VRIw3tU= +golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 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.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -golang.org/x/text v0.6.0 h1:3XmdazWV+ubf7QgHSTWeykHOci5oeekaGJBLkrkaw4k= -golang.org/x/text v0.6.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.12.0 h1:k+n5B8goJNdU7hSvEtMUz3d1Q6D/XW4COJSJR6fN0mc= +golang.org/x/text v0.12.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= +golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/main.go b/main.go index abe11e5..72222f0 100644 --- a/main.go +++ b/main.go @@ -18,6 +18,7 @@ import ( _ "github.com/FloatTech/NanoBot-Plugin/plugin/hyaku" _ "github.com/FloatTech/NanoBot-Plugin/plugin/manager" _ "github.com/FloatTech/NanoBot-Plugin/plugin/runcode" + _ "github.com/FloatTech/NanoBot-Plugin/plugin/score" // -----------------------以下为内置依赖,勿动------------------------ // nano "github.com/fumiama/NanoBot" diff --git a/plugin/score/draw.go b/plugin/score/draw.go new file mode 100644 index 0000000..3ced71e --- /dev/null +++ b/plugin/score/draw.go @@ -0,0 +1,237 @@ +// Package score 签到 +package score + +import ( + "bytes" + "errors" + "image" + "image/color" + "strconv" + "sync" + "time" + + "github.com/FloatTech/floatbox/file" + "github.com/FloatTech/gg" + "github.com/FloatTech/rendercard" + "github.com/FloatTech/zbputils/control" + "github.com/FloatTech/zbputils/img/text" + "github.com/disintegration/imaging" + + "github.com/FloatTech/NanoBot-Plugin/kanban" +) + +func floatstyle(a *scoredata) (img image.Image, err error) { + fontdata, err := file.GetLazyData(text.GlowSansFontFile, control.Md5File, false) + if err != nil { + return + } + + getAvatar, err := initPic(a.picfile, a.avatarurl) + if err != nil { + return + } + + back, err := gg.LoadImage(a.picfile) + if err != nil { + return + } + + bx, by := float64(back.Bounds().Dx()), float64(back.Bounds().Dy()) + + sc := 1280 / bx + + colors := gg.TakeColor(back, 3) + + canvas := gg.NewContext(1280, 1280*int(by)/int(bx)) + + cw, ch := float64(canvas.W()), float64(canvas.H()) + + sch := ch * 6 / 10 + + var blurback, scbackimg, backshadowimg, avatarimg, avatarbackimg, avatarshadowimg, whitetext, blacktext image.Image + var wg sync.WaitGroup + wg.Add(8) + + go func() { + defer wg.Done() + scback := gg.NewContext(canvas.W(), canvas.H()) + scback.ScaleAbout(sc, sc, cw/2, ch/2) + scback.DrawImageAnchored(back, canvas.W()/2, canvas.H()/2, 0.5, 0.5) + scback.Identity() + + go func() { + defer wg.Done() + blurback = imaging.Blur(scback.Image(), 20) + }() + + scbackimg = rendercard.Fillet(scback.Image(), 12) + }() + + go func() { + defer wg.Done() + pureblack := gg.NewContext(canvas.W(), canvas.H()) + pureblack.SetRGBA255(0, 0, 0, 255) + pureblack.Clear() + + shadow := gg.NewContext(canvas.W(), canvas.H()) + shadow.ScaleAbout(0.6, 0.6, cw-cw/3, ch/2) + shadow.DrawImageAnchored(pureblack.Image(), canvas.W()-canvas.W()/3, canvas.H()/2, 0.5, 0.5) + shadow.Identity() + + backshadowimg = imaging.Blur(shadow.Image(), 8) + }() + + aw, ah := (ch-sch)/2/2/2*3, (ch-sch)/2/2/2*3 + + go func() { + defer wg.Done() + avatar, _, err := image.Decode(bytes.NewReader(getAvatar)) + if err != nil { + return + } + + isc := (ch - sch) / 2 / 2 / 2 * 3 / float64(avatar.Bounds().Dy()) + + scavatar := gg.NewContext(int(aw), int(ah)) + + scavatar.ScaleAbout(isc, isc, aw/2, ah/2) + scavatar.DrawImageAnchored(avatar, scavatar.W()/2, scavatar.H()/2, 0.5, 0.5) + scavatar.Identity() + + avatarimg = rendercard.Fillet(scavatar.Image(), 8) + }() + + err = canvas.ParseFontFace(fontdata, (ch-sch)/2/2/2) + if err != nil { + return + } + namew, _ := canvas.MeasureString(a.nickname) + + go func() { + defer wg.Done() + avatarshadowimg = imaging.Blur(customrectangle(cw, ch, aw, ah, namew, color.Black), 8) + }() + + go func() { + defer wg.Done() + avatarbackimg = customrectangle(cw, ch, aw, ah, namew, colors[0]) + }() + + go func() { + defer wg.Done() + whitetext, err = customtext(a, fontdata, cw, ch, aw, color.White) + if err != nil { + return + } + }() + + go func() { + defer wg.Done() + blacktext, err = customtext(a, fontdata, cw, ch, aw, color.Black) + if err != nil { + return + } + }() + + wg.Wait() + if scbackimg == nil || backshadowimg == nil || avatarimg == nil || avatarbackimg == nil || avatarshadowimg == nil || whitetext == nil || blacktext == nil { + err = errors.New("图片渲染失败") + return + } + + canvas.DrawImageAnchored(blurback, canvas.W()/2, canvas.H()/2, 0.5, 0.5) + + canvas.DrawImage(backshadowimg, 0, 0) + + canvas.ScaleAbout(0.6, 0.6, cw-cw/3, ch/2) + canvas.DrawImageAnchored(scbackimg, canvas.W()-canvas.W()/3, canvas.H()/2, 0.5, 0.5) + canvas.Identity() + + canvas.DrawImage(avatarshadowimg, 0, 0) + canvas.DrawImage(avatarbackimg, 0, 0) + canvas.DrawImageAnchored(avatarimg, int((ch-sch)/2/2), int((ch-sch)/2/2), 0.5, 0.5) + + canvas.DrawImage(blacktext, 2, 2) + canvas.DrawImage(whitetext, 0, 0) + + img = canvas.Image() + return +} + +func customrectangle(cw, ch, aw, ah, namew float64, rtgcolor color.Color) (img image.Image) { + canvas := gg.NewContext(int(cw), int(ch)) + sch := ch * 6 / 10 + canvas.DrawRoundedRectangle((ch-sch)/2/2-aw/2-aw/40, (ch-sch)/2/2-aw/2-ah/40, aw+aw/40*2, ah+ah/40*2, 8) + canvas.SetColor(rtgcolor) + canvas.Fill() + canvas.DrawRoundedRectangle((ch-sch)/2/2, (ch-sch)/2/2-ah/4, aw/2+aw/40*5+namew, ah/2, 8) + canvas.Fill() + + img = canvas.Image() + return +} + +func customtext(a *scoredata, fontdata []byte, cw, ch, aw float64, textcolor color.Color) (img image.Image, err error) { + canvas := gg.NewContext(int(cw), int(ch)) + canvas.SetColor(textcolor) + scw, sch := cw*6/10, ch*6/10 + err = canvas.ParseFontFace(fontdata, (ch-sch)/2/2/2) + if err != nil { + return + } + canvas.DrawStringAnchored(a.nickname, (ch-sch)/2/2+aw/2+aw/40*2, (ch-sch)/2/2, 0, 0.5) + err = canvas.ParseFontFace(fontdata, (ch-sch)/2/2/3*2) + if err != nil { + return + } + canvas.DrawStringAnchored(time.Now().Format("2006/01/02"), cw-cw/6, ch/2-sch/2-canvas.FontHeight(), 0.5, 0.5) + + err = canvas.ParseFontFace(fontdata, (ch-sch)/2/2/2) + if err != nil { + return + } + nextrankScore := 0 + if a.rank < 10 { + nextrankScore = rankArray[a.rank+1] + } else { + nextrankScore = SCOREMAX + } + nextLevelStyle := strconv.Itoa(a.level) + "/" + strconv.Itoa(nextrankScore) + + canvas.DrawStringAnchored("Level "+strconv.Itoa(a.rank), cw/3*2-scw/2, ch/2+sch/2+canvas.FontHeight(), 0, 0.5) + canvas.DrawStringAnchored(nextLevelStyle, cw/3*2+scw/2, ch/2+sch/2+canvas.FontHeight(), 1, 0.5) + + err = canvas.ParseFontFace(fontdata, (ch-sch)/2/2/3) + if err != nil { + return + } + + canvas.DrawStringAnchored("Create By NanoBot-Plugin "+kanban.Version, 0+4, ch, 0, -0.5) + + err = canvas.ParseFontFace(fontdata, (ch-sch)/2/5*3) + if err != nil { + return + } + + tempfh := canvas.FontHeight() + + canvas.DrawStringAnchored(getHourWord(time.Now()), ((cw-scw)-(cw/3-scw/2))/8, (ch-sch)/2+sch/4, 0, 0.5) + + err = canvas.ParseFontFace(fontdata, (ch-sch)/2/5) + if err != nil { + return + } + + canvas.DrawStringAnchored("ATRI币 + "+strconv.Itoa(a.inc), ((cw-scw)-(cw/3-scw/2))/8, (ch-sch)/2+sch/4+tempfh, 0, 0.5) + canvas.DrawStringAnchored("EXP + 1", ((cw-scw)-(cw/3-scw/2))/8, (ch-sch)/2+sch/4+tempfh+canvas.FontHeight(), 0, 1) + + err = canvas.ParseFontFace(fontdata, (ch-sch)/2/4) + if err != nil { + return + } + + canvas.DrawStringAnchored("你有 "+strconv.Itoa(a.score)+" 枚ATRI币", ((cw-scw)-(cw/3-scw/2))/8, (ch-sch)/2+sch/4*3, 0, 0.5) + + img = canvas.Image() + return +} diff --git a/plugin/score/model.go b/plugin/score/model.go new file mode 100644 index 0000000..34d87b5 --- /dev/null +++ b/plugin/score/model.go @@ -0,0 +1,135 @@ +package score + +import ( + "os" + "time" + + "github.com/jinzhu/gorm" +) + +// sdb 得分数据库 +var sdb *scoredb + +// scoredb 分数数据库 +type scoredb gorm.DB + +// scoretable 分数结构体 +type scoretable struct { + UID int64 `gorm:"column:uid;primary_key"` + Score int `gorm:"column:score;default:0"` +} + +// TableName ... +func (scoretable) TableName() string { + return "score" +} + +// signintable 签到结构体 +type signintable struct { + UID int64 `gorm:"column:uid;primary_key"` + Count int `gorm:"column:count;default:0"` + UpdatedAt time.Time +} + +// TableName ... +func (signintable) TableName() string { + return "sign_in" +} + +// initialize 初始化ScoreDB数据库 +func initialize(dbpath string) *scoredb { + var err error + if _, err = os.Stat(dbpath); err != nil || os.IsNotExist(err) { + // 生成文件 + f, err := os.Create(dbpath) + if err != nil { + return nil + } + defer f.Close() + } + gdb, err := gorm.Open("sqlite3", dbpath) + if err != nil { + panic(err) + } + gdb.AutoMigrate(&scoretable{}).AutoMigrate(&signintable{}) + return (*scoredb)(gdb) +} + +// Close ... +func (sdb *scoredb) Close() error { + db := (*gorm.DB)(sdb) + return db.Close() +} + +// GetScoreByUID 取得分数 +func (sdb *scoredb) GetScoreByUID(uid int64) (s scoretable) { + db := (*gorm.DB)(sdb) + db.Model(&scoretable{}).FirstOrCreate(&s, "uid = ? ", uid) + return s +} + +// InsertOrUpdateScoreByUID 插入或更新分数 +func (sdb *scoredb) InsertOrUpdateScoreByUID(uid int64, score int) (err error) { + db := (*gorm.DB)(sdb) + s := scoretable{ + UID: uid, + Score: score, + } + if err = db.Model(&scoretable{}).First(&s, "uid = ? ", uid).Error; err != nil { + // error handling... + if gorm.IsRecordNotFoundError(err) { + err = db.Model(&scoretable{}).Create(&s).Error // newUser not user + } + } else { + err = db.Model(&scoretable{}).Where("uid = ? ", uid).Update( + map[string]any{ + "score": score, + }).Error + } + return +} + +// GetSignInByUID 取得签到次数 +func (sdb *scoredb) GetSignInByUID(uid int64) (si signintable) { + db := (*gorm.DB)(sdb) + db.Model(&signintable{}).FirstOrCreate(&si, "uid = ? ", uid) + return si +} + +// InsertOrUpdateSignInCountByUID 插入或更新签到次数 +func (sdb *scoredb) InsertOrUpdateSignInCountByUID(uid int64, count int) (err error) { + db := (*gorm.DB)(sdb) + si := signintable{ + UID: uid, + Count: count, + } + if err = db.Model(&signintable{}).First(&si, "uid = ? ", uid).Error; err != nil { + // error handling... + if gorm.IsRecordNotFoundError(err) { + err = db.Model(&signintable{}).Create(&si).Error // newUser not user + } + } else { + err = db.Model(&signintable{}).Where("uid = ? ", uid).Update( + map[string]any{ + "count": count, + }).Error + } + return +} + +func (sdb *scoredb) GetScoreRankByTopN(n int) (st []scoretable, err error) { + db := (*gorm.DB)(sdb) + err = db.Model(&scoretable{}).Order("score desc").Limit(n).Find(&st).Error + return +} + +type scoredata struct { + drawedfile string + picfile string + avatarurl string + nickname string + inc int // 增加币 + score int // 钱包 + level int + rank int +} diff --git a/plugin/score/sign_in.go b/plugin/score/sign_in.go new file mode 100644 index 0000000..b62a95f --- /dev/null +++ b/plugin/score/sign_in.go @@ -0,0 +1,306 @@ +// Package score 签到 +package score + +import ( + "math" + "math/rand" + "os" + "strconv" + "strings" + "time" + + "github.com/FloatTech/AnimeAPI/bilibili" + "github.com/FloatTech/AnimeAPI/wallet" + "github.com/FloatTech/NanoBot-Plugin/utils/ctxext" + "github.com/FloatTech/floatbox/file" + "github.com/FloatTech/floatbox/process" + "github.com/FloatTech/floatbox/web" + "github.com/FloatTech/imgfactory" + ctrl "github.com/FloatTech/zbpctrl" + "github.com/FloatTech/zbputils/control" + "github.com/FloatTech/zbputils/img/text" + nano "github.com/fumiama/NanoBot" + "github.com/golang/freetype" + "github.com/wcharczuk/go-chart/v2" +) + +const ( + backgroundURL = "https://iw233.cn/api.php?sort=pc" + referer = "https://weibo.com/" + signinMax = 1 + // SCOREMAX 分数上限定为1200 + SCOREMAX = 1200 +) + +var ( + rankArray = [...]int{0, 10, 20, 50, 100, 200, 350, 550, 750, 1000, 1200} + engine = nano.Register("score", &ctrl.Options[*nano.Ctx]{ + DisableOnDefault: false, + Brief: "签到", + Help: "- 签到\n | 获得签到背景\n- 查看等级排名\n注:为跨群排名\n- 查看我的钱包\n- 查看钱包排名\n注:为本群排行,若群人数太多不建议使用该功能!!!", + PrivateDataFolder: "score", + }) +) + +func init() { + cachePath := engine.DataFolder() + "cache/" + go func() { + ok := file.IsExist(cachePath) + if !ok { + err := os.MkdirAll(cachePath, 0777) + if err != nil { + panic(err) + } + return + } + files, err := os.ReadDir(cachePath) + if err == nil { + for _, f := range files { + if !strings.Contains(f.Name(), time.Now().Format("20060102")) { + _ = os.Remove(cachePath + f.Name()) + } + } + } + sdb = initialize(engine.DataFolder() + "score.db") + }() + engine.OnMessageRegex("签到").Limit(ctxext.LimitByUser).SetBlock(true).Handle(func(ctx *nano.Ctx) { + uid := ctx.Message.Author.ID + if uid == "" { + _, _ = ctx.SendPlainMessage(false, "ERROR: 未获取到用户uid") + return + } + uidint, _ := strconv.ParseInt(uid, 10, 64) + today := time.Now().Format("20060102") + // 签到图片 + drawedFile := cachePath + uid + today + "signin.png" + picFile := cachePath + uid + today + ".png" + // 获取签到时间 + si := sdb.GetSignInByUID(uidint) + siUpdateTimeStr := si.UpdatedAt.Format("20060102") + switch { + case si.Count >= signinMax && siUpdateTimeStr == today: + // 如果签到时间是今天 + _, err := ctx.SendPlainMessage(true, "今天你已经签到过了!") + if err != nil { + _, _ = ctx.SendPlainMessage(false, "ERROR: ", err) + } + if file.IsExist(drawedFile) { + _, err := ctx.SendImage("file:///"+file.BOTPATH+"/"+drawedFile, false) + if err != nil { + _, _ = ctx.SendPlainMessage(false, "ERROR: ", err) + } + } + return + case siUpdateTimeStr != today: + // 如果是跨天签到就清数据 + err := sdb.InsertOrUpdateSignInCountByUID(uidint, 0) + if err != nil { + _, _ = ctx.SendPlainMessage(false, "ERROR: ", err) + return + } + } + // 更新签到次数 + err := sdb.InsertOrUpdateSignInCountByUID(uidint, si.Count+1) + if err != nil { + _, _ = ctx.SendPlainMessage(false, "ERROR: ", err) + return + } + // 更新经验 + level := sdb.GetScoreByUID(uidint).Score + 1 + if level > SCOREMAX { + level = SCOREMAX + _, err := ctx.SendPlainMessage(true, "你的等级已经达到上限") + if err != nil { + _, _ = ctx.SendPlainMessage(false, "ERROR: ", err) + } + } + err = sdb.InsertOrUpdateScoreByUID(uidint, level) + if err != nil { + _, _ = ctx.SendPlainMessage(false, "ERROR: ", err) + return + } + // 更新钱包 + rank := getrank(level) + add := 1 + rand.Intn(10) + rank*5 // 等级越高获得的钱越高 + + go func() { + err = wallet.InsertWalletOf(uidint, add) + if err != nil { + _, _ = ctx.SendPlainMessage(false, "ERROR: ", err) + return + } + }() + alldata := &scoredata{ + drawedfile: drawedFile, + picfile: picFile, + avatarurl: ctx.Message.Author.Avatar, + nickname: ctx.Message.Author.Username, + inc: add, + score: wallet.GetWalletOf(uidint), + level: level, + rank: rank, + } + drawimage, err := floatstyle(alldata) + if err != nil { + _, _ = ctx.SendPlainMessage(false, "ERROR: ", err) + return + } + // done. + f, err := os.Create(drawedFile) + if err == nil { + _, err = imgfactory.WriteTo(drawimage, f) + } + defer f.Close() + if err != nil { + _, _ = ctx.SendPlainMessage(false, "ERROR: ", err) + return + } + _, err = ctx.SendImage("file:///"+file.BOTPATH+"/"+drawedFile, false) + if err != nil { + _, _ = ctx.SendPlainMessage(false, "ERROR: ", err) + } + }) + + engine.OnMessageFullMatch("获得签到背景", nano.OnlyPublic).Limit(ctxext.LimitByGroup).SetBlock(true). + Handle(func(ctx *nano.Ctx) { + uidStr := ctx.Message.Author.ID + picFile := cachePath + uidStr + time.Now().Format("20060102") + ".png" + if file.IsNotExist(picFile) { + _, err := ctx.SendPlainMessage(true, "请先签到!") + if err != nil { + _, _ = ctx.SendPlainMessage(false, "ERROR: ", err) + } + return + } + if _, err := ctx.SendImage("file:///"+file.BOTPATH+"/"+picFile, false); err != nil { + _, _ = ctx.SendPlainMessage(false, "ERROR: ", err) + } + }) + engine.OnMessageFullMatch("查看等级排名", nano.OnlyPublic).Limit(ctxext.LimitByGroup).SetBlock(true). + Handle(func(ctx *nano.Ctx) { + today := time.Now().Format("20060102") + drawedFile := cachePath + today + "scoreRank.png" + if file.IsExist(drawedFile) { + _, err := ctx.SendImage("file:///"+file.BOTPATH+"/"+drawedFile, false) + if err != nil { + _, _ = ctx.SendPlainMessage(false, "ERROR: ", err) + + } + return + } + st, err := sdb.GetScoreRankByTopN(10) + if err != nil { + _, _ = ctx.SendPlainMessage(false, "ERROR: ", err) + return + } + if len(st) == 0 { + _, _ = ctx.SendPlainMessage(false, "ERROR: 目前还没有人签到过") + return + } + _, err = file.GetLazyData(text.FontFile, control.Md5File, true) + if err != nil { + _, _ = ctx.SendPlainMessage(false, "ERROR: ", err) + return + } + b, err := os.ReadFile(text.FontFile) + if err != nil { + _, _ = ctx.SendPlainMessage(false, "ERROR: ", err) + return + } + font, err := freetype.ParseFont(b) + if err != nil { + _, _ = ctx.SendPlainMessage(false, "ERROR: ", err) + return + } + f, err := os.Create(drawedFile) + if err != nil { + _, _ = ctx.SendPlainMessage(false, "ERROR: ", err) + return + } + var bars []chart.Value + for _, v := range st { + if v.Score != 0 { + bars = append(bars, chart.Value{ + Label: ctx.Message.Author.Username, + Value: float64(v.Score), + }) + } + } + err = chart.BarChart{ + Font: font, + Title: "等级排名(1天只刷新1次)", + Background: chart.Style{ + Padding: chart.Box{ + Top: 40, + }, + }, + YAxis: chart.YAxis{ + Range: &chart.ContinuousRange{ + Min: 0, + Max: math.Ceil(bars[0].Value/10) * 10, + }, + }, + Height: 500, + BarWidth: 50, + Bars: bars, + }.Render(chart.PNG, f) + _ = f.Close() + if err != nil { + _ = os.Remove(drawedFile) + _, _ = ctx.SendPlainMessage(false, "ERROR: ", err) + return + } + if _, err := ctx.SendImage("file:///"+file.BOTPATH+"/"+drawedFile, false); err != nil { + _, _ = ctx.SendPlainMessage(false, "ERROR: ", err) + } + }) +} + +func getHourWord(t time.Time) string { + h := t.Hour() + switch { + case 6 <= h && h < 12: + return "早上好" + case 12 <= h && h < 14: + return "中午好" + case 14 <= h && h < 19: + return "下午好" + case 19 <= h && h < 24: + return "晚上好" + case 0 <= h && h < 6: + return "凌晨好" + default: + return "" + } +} + +func getrank(count int) int { + for k, v := range rankArray { + if count == v { + return k + } else if count < v { + return k - 1 + } + } + return -1 +} + +func initPic(picFile string, avatarurl string) (avatar []byte, err error) { + defer process.SleepAbout1sTo2s() + avatar, err = web.GetData(avatarurl) + if err != nil { + return + } + if file.IsExist(picFile) { + return + } + url, err := bilibili.GetRealURL(backgroundURL) + if err != nil { + return + } + data, err := web.RequestDataWith(web.NewDefaultClient(), url, "", referer, "", nil) + if err != nil { + return + } + return avatar, os.WriteFile(picFile, data, 0644) +} From 0682808bee7c3913aad912cc3d40144960a0cd75 Mon Sep 17 00:00:00 2001 From: Jiang-Red <79574799+Jiang-Red@users.noreply.github.com> Date: Mon, 16 Oct 2023 13:54:46 +0000 Subject: [PATCH 2/5] update README.md --- README.md | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/README.md b/README.md index 955bb97..f6a46b1 100644 --- a/README.md +++ b/README.md @@ -148,6 +148,19 @@ nanobot [-Tadhst] ID1 ID2 ... +
+ 在线代码运行 + + `import _ "github.com/FloatTech/NanoBot-Plugin/plugin/score"` + + - [x] 签到 + + - [x] 获得签到背景 + + - [x] 查看等级排名 + +
+ ## 特别感谢 From 3bfd0d906288c12629e817bfcde22682e8fb3fb4 Mon Sep 17 00:00:00 2001 From: Jiang-Red <79574799+Jiang-Red@users.noreply.github.com> Date: Mon, 16 Oct 2023 14:05:42 +0000 Subject: [PATCH 3/5] update --- go.mod | 2 +- go.sum | 4 ++-- plugin/fortune/fortune.go | 2 +- plugin/score/sign_in.go | 3 +-- 4 files changed, 5 insertions(+), 6 deletions(-) diff --git a/go.mod b/go.mod index 2833dcb..b3e0739 100644 --- a/go.mod +++ b/go.mod @@ -11,7 +11,7 @@ require ( github.com/FloatTech/zbpctrl v1.5.3-0.20230514154630-b74e6fcca380 github.com/FloatTech/zbputils v1.6.2-0.20231004125426-3f1ffcf78f51 github.com/disintegration/imaging v1.6.2 - github.com/fumiama/NanoBot v0.0.0-20231016070353-5314405eeb9e + github.com/fumiama/NanoBot v0.0.0-20231016135651-1315cd67a423 github.com/fumiama/go-base16384 v1.7.0 github.com/fumiama/unibase2n v0.0.0-20221020155353-02876e777430 github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0 diff --git a/go.sum b/go.sum index 8b2aa8b..bda49c5 100644 --- a/go.sum +++ b/go.sum @@ -35,8 +35,8 @@ github.com/ericpauley/go-quantize v0.0.0-20200331213906-ae555eb2afa4 h1:BBade+Jl github.com/ericpauley/go-quantize v0.0.0-20200331213906-ae555eb2afa4/go.mod h1:H7chHJglrhPPzetLdzBleF8d22WYOv7UM/lEKYiwlKM= github.com/erikstmartin/go-testdb v0.0.0-20160219214506-8d10e4a1bae5 h1:Yzb9+7DPaBjB8zlTR87/ElzFsnQfuHnVUVqpZZIcV5Y= github.com/erikstmartin/go-testdb v0.0.0-20160219214506-8d10e4a1bae5/go.mod h1:a2zkGnVExMxdzMo3M0Hi/3sEU+cWnZpSni0O6/Yb/P0= -github.com/fumiama/NanoBot v0.0.0-20231016070353-5314405eeb9e h1:lYg7g8CbOpEucXGGdYannbhleho0Avatq0afdtr0fGE= -github.com/fumiama/NanoBot v0.0.0-20231016070353-5314405eeb9e/go.mod h1:zUciPsZ7Vun5eLQucYohuj7VY4zEQm33406+3LtjJFc= +github.com/fumiama/NanoBot v0.0.0-20231016135651-1315cd67a423 h1:BwOdaSMmQh+l5isUMb4iRFuqYeNeOlCl75TxhicpZhQ= +github.com/fumiama/NanoBot v0.0.0-20231016135651-1315cd67a423/go.mod h1:zUciPsZ7Vun5eLQucYohuj7VY4zEQm33406+3LtjJFc= github.com/fumiama/bigfft v0.0.0-20211011143303-6e0bfa3c836b h1:Zt3pFQditAdWTHCOVkiloc9ZauBoWrb37guFV4iIRvE= github.com/fumiama/bigfft v0.0.0-20211011143303-6e0bfa3c836b/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= github.com/fumiama/cron v1.3.0 h1:ZWlwuexF+HQHl3cYytEE5HNwD99q+3vNZF1GrEiXCFo= diff --git a/plugin/fortune/fortune.go b/plugin/fortune/fortune.go index ba217a6..693d590 100644 --- a/plugin/fortune/fortune.go +++ b/plugin/fortune/fortune.go @@ -125,7 +125,7 @@ func init() { } // 检查背景图片是否存在 zipfile := images + kind + ".zip" - _, err := file.GetLazyData(zipfile, "data/control/stor.spb", false) + _, err := file.GetLazyData(zipfile, nano.Md5File, false) if err != nil { _, _ = ctx.SendPlainMessage(false, "ERROR: ", err) return diff --git a/plugin/score/sign_in.go b/plugin/score/sign_in.go index b62a95f..21e1d3a 100644 --- a/plugin/score/sign_in.go +++ b/plugin/score/sign_in.go @@ -17,7 +17,6 @@ import ( "github.com/FloatTech/floatbox/web" "github.com/FloatTech/imgfactory" ctrl "github.com/FloatTech/zbpctrl" - "github.com/FloatTech/zbputils/control" "github.com/FloatTech/zbputils/img/text" nano "github.com/fumiama/NanoBot" "github.com/golang/freetype" @@ -197,7 +196,7 @@ func init() { _, _ = ctx.SendPlainMessage(false, "ERROR: 目前还没有人签到过") return } - _, err = file.GetLazyData(text.FontFile, control.Md5File, true) + _, err = file.GetLazyData(text.FontFile, nano.Md5File, true) if err != nil { _, _ = ctx.SendPlainMessage(false, "ERROR: ", err) return From d83183150066bf7effb385f9d52cf26d94a06d94 Mon Sep 17 00:00:00 2001 From: Jiang-Red <79574799+Jiang-Red@users.noreply.github.com> Date: Mon, 16 Oct 2023 14:27:30 +0000 Subject: [PATCH 4/5] make lint happy --- kanban/init.go | 1 + main.go | 6 ++++-- plugin/hyaku/main.go | 2 +- utils/ctxext/speed.go | 12 +++++++++--- 4 files changed, 15 insertions(+), 6 deletions(-) diff --git a/kanban/init.go b/kanban/init.go index 4724a09..0415dac 100644 --- a/kanban/init.go +++ b/kanban/init.go @@ -9,6 +9,7 @@ func init() { PrintBanner() } +// PrintBanner 输出公告 func PrintBanner() { fmt.Print( "\n======================[NanoBot-Plugin]======================", diff --git a/main.go b/main.go index 72222f0..84c67a6 100644 --- a/main.go +++ b/main.go @@ -1,3 +1,4 @@ +// Package main NanoBot-Plugin main file package main import ( @@ -29,7 +30,8 @@ import ( ) func main() { - rand.Seed(time.Now().UnixNano()) // 全局 seed,其他插件无需再 seed + // 全局 seed,其他插件无需再 seed + rand.Seed(time.Now().UnixNano()) //nolint: staticcheck token := flag.String("t", "", "qq api token") appid := flag.String("a", "", "qq appid") @@ -66,7 +68,7 @@ func main() { Handle(func(ctx *nano.Ctx) { _, _ = ctx.SendPlainMessage(false, kanban.Banner) }) - nano.Run(&nano.Bot{ + _ = nano.Run(&nano.Bot{ AppID: *appid, Token: *token, Secret: *secret, diff --git a/plugin/hyaku/main.go b/plugin/hyaku/main.go index 071ddb0..e087c27 100644 --- a/plugin/hyaku/main.go +++ b/plugin/hyaku/main.go @@ -23,7 +23,7 @@ import ( const bed = "https://gitcode.net/u011570312/OguraHyakuninIsshu/-/raw/master/" -// nolint: asciicheck +//nolint:asciicheck, structcheck type line struct { 番号, 歌人, 上の句, 下の句, 上の句ひらがな, 下の句ひらがな string } diff --git a/utils/ctxext/speed.go b/utils/ctxext/speed.go index cf30888..4028712 100644 --- a/utils/ctxext/speed.go +++ b/utils/ctxext/speed.go @@ -33,6 +33,7 @@ var DefaultSingle = nano.NewSingle( // 每 10s 5次触发 var defaultLimiterManager = rate.NewManager[int64](time.Second*10, 5) +//nolint:structcheck type fakeLM struct { limiters unsafe.Pointer interval time.Duration @@ -56,8 +57,10 @@ func LimitByUser(ctx *nano.Ctx) *rate.Limiter { case *nano.Message: id, _ := strconv.ParseUint(msg.Author.ID, 10, 64) return defaultLimiterManager.Load(int64(id)) + default: + return defaultLimiterManager.Load(0) } - return defaultLimiterManager.Load(0) + } // LimitByGroup 默认限速器 每 10s 5次触发 @@ -68,8 +71,9 @@ func LimitByGroup(ctx *nano.Ctx) *rate.Limiter { case *nano.Message: id, _ := strconv.ParseUint(msg.GuildID, 10, 64) return defaultLimiterManager.Load(int64(id)) + default: + return defaultLimiterManager.Load(0) } - return defaultLimiterManager.Load(0) } // LimitByChannel 默认限速器 每 10s 5次触发 @@ -80,8 +84,9 @@ func LimitByChannel(ctx *nano.Ctx) *rate.Limiter { case *nano.Message: id, _ := strconv.ParseUint(msg.ChannelID, 10, 64) return defaultLimiterManager.Load(int64(id)) + default: + return defaultLimiterManager.Load(0) } - return defaultLimiterManager.Load(0) } // LimiterManager 自定义限速器管理 @@ -131,6 +136,7 @@ func (m LimiterManager) LimitByChannel(ctx *nano.Ctx) *rate.Limiter { return defaultLimiterManager.Load(0) } +// MustMessageNotNil 消息是否不为空 func MustMessageNotNil(ctx *nano.Ctx) bool { return ctx.Message != nil } From cb187d6a639f797fdb22cd4eaa6987f21f7d350a Mon Sep 17 00:00:00 2001 From: Jiang-Red <79574799+Jiang-Red@users.noreply.github.com> Date: Mon, 16 Oct 2023 14:31:16 +0000 Subject: [PATCH 5/5] deleted control --- plugin/score/draw.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/plugin/score/draw.go b/plugin/score/draw.go index 3ced71e..b0d9c02 100644 --- a/plugin/score/draw.go +++ b/plugin/score/draw.go @@ -13,15 +13,15 @@ import ( "github.com/FloatTech/floatbox/file" "github.com/FloatTech/gg" "github.com/FloatTech/rendercard" - "github.com/FloatTech/zbputils/control" "github.com/FloatTech/zbputils/img/text" "github.com/disintegration/imaging" + nano "github.com/fumiama/NanoBot" "github.com/FloatTech/NanoBot-Plugin/kanban" ) func floatstyle(a *scoredata) (img image.Image, err error) { - fontdata, err := file.GetLazyData(text.GlowSansFontFile, control.Md5File, false) + fontdata, err := file.GetLazyData(text.GlowSansFontFile, nano.Md5File, false) if err != nil { return }