Skip to content

Commit

Permalink
modify: use diff alias source (AkihaProject+LxnsNet Maimai)
Browse files Browse the repository at this point in the history
  • Loading branch information
MoYoez committed Mar 5, 2024
1 parent 605dc7d commit 700e162
Show file tree
Hide file tree
Showing 6 changed files with 342 additions and 111 deletions.
10 changes: 9 additions & 1 deletion go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ require (
github.com/sirupsen/logrus v1.9.0
github.com/tidwall/gjson v1.14.4
github.com/wdvxdr1123/ZeroBot v1.6.9
github.com/xuri/excelize/v2 v2.8.1
golang.org/x/image v0.14.0
golang.org/x/text v0.14.0
gopkg.in/yaml.v3 v3.0.1
Expand All @@ -41,13 +42,20 @@ require (
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/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826 // indirect
github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0 // indirect
github.com/richardlehane/mscfb v1.0.4 // indirect
github.com/richardlehane/msoleps v1.0.3 // indirect
github.com/tidwall/match v1.1.1 // indirect
github.com/tidwall/pretty v1.2.0 // indirect
github.com/tklauser/go-sysconf v0.3.12 // indirect
github.com/tklauser/numcpus v0.6.1 // indirect
github.com/xuri/efp v0.0.0-20231025114914-d1ff6096ae53 // indirect
github.com/xuri/nfp v0.0.0-20230919160717-d98342af3f05 // indirect
github.com/yusufpapurcu/wmi v1.2.3 // indirect
golang.org/x/sys v0.11.0 // indirect
golang.org/x/crypto v0.21.0 // indirect
golang.org/x/net v0.22.0 // indirect
golang.org/x/sys v0.18.0 // indirect
modernc.org/libc v1.21.5 // indirect
modernc.org/mathutil v1.5.0 // indirect
modernc.org/memory v1.4.0 // indirect
Expand Down
24 changes: 21 additions & 3 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -75,18 +75,26 @@ github.com/mattn/go-isatty v0.0.16 h1:bq3VjFmv/sOjHtdEhmkEV4x1AJtvUvOJ2PFAZ5+peK
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/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826 h1:RWengNIwukTxcDr9M+97sNutRR1RKhG96O6jWumTTnw=
github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826/go.mod h1:TaXosZuwdSHYgviHp1DAtfrULt5eUgsSMsZf+YrPgl8=
github.com/mroth/weightedrand v1.0.0 h1:V8JeHChvl2MP1sAoXq4brElOcza+jxLkRuwvtQu8L3E=
github.com/mroth/weightedrand v1.0.0/go.mod h1:3p2SIcC8al1YMzGhAIoXD+r9olo/g/cdJgAD905gyNE=
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/richardlehane/mscfb v1.0.4 h1:WULscsljNPConisD5hR0+OyZjwK46Pfyr6mPu5ZawpM=
github.com/richardlehane/mscfb v1.0.4/go.mod h1:YzVpcZg9czvAuhk9T+a3avCpcFPMUWm7gK3DypaEsUk=
github.com/richardlehane/msoleps v1.0.1/go.mod h1:BWev5JBpU9Ko2WAgmZEuiz4/u3ZYTKbjLycmwiWUfWg=
github.com/richardlehane/msoleps v1.0.3 h1:aznSZzrwYRl3rLKRT3gUk9am7T/mLNSnJINvN0AQoVM=
github.com/richardlehane/msoleps v1.0.3/go.mod h1:BWev5JBpU9Ko2WAgmZEuiz4/u3ZYTKbjLycmwiWUfWg=
github.com/shirou/gopsutil v3.21.11+incompatible h1:+1+c1VGhc88SSonWP6foOcLhvnKlUeu/erjjvaPEYiI=
github.com/shirou/gopsutil v3.21.11+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA=
github.com/sirupsen/logrus v1.9.0 h1:trlNQbNUG3OdDrDil03MCb1H2o9nJ1x4/5LYw7byDE0=
github.com/sirupsen/logrus v1.9.0/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ=
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
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.1 h1:w7B6lhMri9wdJUVmEZPGGhZzrYTPvgJArz7wNPgYKsk=
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/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=
Expand All @@ -99,28 +107,38 @@ github.com/tklauser/numcpus v0.6.1 h1:ng9scYS7az0Bk4OZLvrNXNSAO2Pxr1XXRAPyjhIx+F
github.com/tklauser/numcpus v0.6.1/go.mod h1:1XfjsgE2zo8GVw7POkMbHENHzVg3GzmoZ9fESEdAacY=
github.com/wdvxdr1123/ZeroBot v1.6.9 h1:vaFqtIXpyeU60xEddg4EsN6cX6cpB3MKhLbe/MQ5OVw=
github.com/wdvxdr1123/ZeroBot v1.6.9/go.mod h1:T5kD5vLi/YxL/fyDOCOaawi96LRBdJjcXh2CIjDyFfg=
github.com/xuri/efp v0.0.0-20231025114914-d1ff6096ae53 h1:Chd9DkqERQQuHpXjR/HSV1jLZA6uaoiwwH3vSuF3IW0=
github.com/xuri/efp v0.0.0-20231025114914-d1ff6096ae53/go.mod h1:ybY/Jr0T0GTCnYjKqmdwxyxn2BQf2RcQIIvex5QldPI=
github.com/xuri/excelize/v2 v2.8.1 h1:pZLMEwK8ep+CLIUWpWmvW8IWE/yxqG0I1xcN6cVMGuQ=
github.com/xuri/excelize/v2 v2.8.1/go.mod h1:oli1E4C3Pa5RXg1TBXn4ENCXDV5JUMlBluUhG7c+CEE=
github.com/xuri/nfp v0.0.0-20230919160717-d98342af3f05 h1:qhbILQo1K3mphbwKh1vNm4oGezE1eF9fQWmNiIpSfI4=
github.com/xuri/nfp v0.0.0-20230919160717-d98342af3f05/go.mod h1:WwHg+CVyzlv/TX9xqBFXEZAuxOPxn2k1GNHwG41IIUQ=
github.com/yusufpapurcu/wmi v1.2.3 h1:E1ctvB7uKFMOJw3fdOW32DwGE9I7t++CRUEMKvFoFiw=
github.com/yusufpapurcu/wmi v1.2.3/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0=
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 h1:GGJVjV8waZKRHrgwvtH66z9ZGVurTD1MT0n1Bb+q4aM=
golang.org/x/crypto v0.0.0-20191205180655-e7c4368fe9dd/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
golang.org/x/crypto v0.21.0 h1:X31++rzVUdKhX5sWmSOFZxx8UW/ldWx55cbf08iNAMA=
golang.org/x/crypto v0.21.0/go.mod h1:0BP7YvVV9gBbVKyeTG0Gyn+gZm94bibOW5BjDEYAOMs=
golang.org/x/image v0.0.0-20191009234506-e7c1f5e7dbb8/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
golang.org/x/image v0.14.0 h1:tNgSxAFe3jC4uYqvZdTr84SZoM1KfwdC9SKIFrLjFn4=
golang.org/x/image v0.14.0/go.mod h1:HUYqC05R2ZcZ3ejNQsIHQDQiwWM4JBqmm6MKANTp4LE=
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-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.22.0 h1:9sGLhx7iRIHEiX0oAJ3MRZMUCElJgy7Br1nO+AMN3Tc=
golang.org/x/net v0.22.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg=
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-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.11.0 h1:eG7RXZHdqOJ1i+0lgLgCpSXAp6M3LYlAo6osgSi0xOM=
golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.18.0 h1:DBdB3niSjOA/O0blCZBqDefyWNYveAYMNF1Wum0DYQ4=
golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ=
Expand Down
246 changes: 227 additions & 19 deletions plugin/mai/alias.go
Original file line number Diff line number Diff line change
@@ -1,43 +1,251 @@
package mai

Check failure on line 1 in plugin/mai/alias.go

View workflow job for this annotation

GitHub Actions / lint

: # github.com/MoYoez/Lucy_reibot/plugin/mai

import (
"bytes"
"encoding/json"
"github.com/FloatTech/floatbox/web"
"fmt"
"github.com/xuri/excelize/v2"
"io"
"net/http"
"os"
"strconv"
)

type MappedListStruct struct {
DingFishId int `json:"dv_id"`
SongName string `json:"song_name"`
SongId []int `json:"song_id"`
Aliases []string `json:"aliases"`
}

type LxnsSongListInfo struct {
Songs []struct {
Id int `json:"id"`
Title string `json:"title"`
Artist string `json:"artist"`
Genre string `json:"genre"`
Bpm int `json:"bpm"`
Version int `json:"version"`
Difficulties struct {
Standard []struct {
Type string `json:"type"`
Difficulty int `json:"difficulty"`
Level string `json:"level"`
LevelValue float64 `json:"level_value"`
NoteDesigner string `json:"note_designer"`
Version int `json:"version"`
} `json:"standard"`
Dx []struct {
Type string `json:"type"`
Difficulty int `json:"difficulty"`
Level string `json:"level"`
LevelValue float64 `json:"level_value"`
NoteDesigner string `json:"note_designer"`
Version int `json:"version"`
} `json:"dx"`
} `json:"difficulties"`
} `json:"songs"`
Genres []struct {
Id int `json:"id"`
Title string `json:"title"`
Genre string `json:"genre"`
} `json:"genres"`
Versions []struct {
Id int `json:"id"`
Title string `json:"title"`
Version int `json:"version"`
} `json:"versions"`
}

type LxnsAliases struct {
Aliases []struct {
SongId int `json:"song_id"`
Aliases []string `json:"aliases"`
} `json:"aliases"`
}

// only support LXNS because => DivingFish need Token.
type AliasesReturnValue struct {
Aliases []struct {
DvId int `json:"dv_id"`
SongName string `json:"song_name"`
SongId []int `json:"song_id"`
Aliases []string `json:"aliases"`
} `json:"aliases"`
}

// only support LXNS because => if DivingFish then need Token.

// RequestAliasFromLxns Get Alias From LXNS Network.
func RequestAliasFromLxns() LxnsAliases {
getData, err := web.RequestDataWithHeaders(web.NewDefaultClient(), "https://maimai.lxns.net/api/v0/maimai/alias/list", "GET", func(request *http.Request) error {
request.Header.Add("Authorization", os.Getenv("lxnskey"))
return nil
}, nil)
// QueryReferSong use LocalStorageData.
func QueryReferSong(Alias string, isLxnet bool) (status bool, id []int, needAcc bool) {
// unpackedData
getData, err := os.ReadFile(engine.DataFolder() + "alias.json")
if err != nil {
return LxnsAliases{}
panic(err)
}
var DataHandler AliasesReturnValue
json.Unmarshal(getData, &DataHandler)
var onloadList [][]int
for _, dataSearcher := range DataHandler.Aliases {
for _, aliasSearcher := range dataSearcher.Aliases {
if aliasSearcher == Alias {
onloadList = append(onloadList, dataSearcher.SongId) // write in memory
}
}
}
var handlerData LxnsAliases
json.Unmarshal(getData, &handlerData)
return handlerData
// if list is 2,query them is from the same song? | if above 2(3 or more ,means this song need acc.)
switch {
case len(onloadList) == 1: // only one query.
if isLxnet {
for _, listhere := range onloadList[0] {
if listhere < 10000 {
return true, []int{listhere}, false
}
}
} else {
return true, onloadList[0], false
}
// query length is 2,it means this maybe same name but diff id ==> (E.G: Oshama Scramble!)
case len(onloadList) == 2:
for _, listHere := range onloadList[0] {
for _, listAliasTwo := range onloadList[1] {
if listHere == listAliasTwo {
// same list here.
var returnIntList []int
returnIntList = append(returnIntList, onloadList[0]...)
returnIntList = append(returnIntList, onloadList[1]...)
returnIntList = removeIntDuplicates(returnIntList)
if isLxnet {
for _, listhere := range returnIntList {
if listhere < 10000 {
return true, []int{listhere}, false
}
}
} else {
return true, returnIntList, false
}
}
}
}
// if query is none, means it need moreacc
return true, nil, true
case len(onloadList) >= 3:
return true, nil, true
}
// no found.
return false, nil, false
}

// QueryReferSong CASE: In DivingFish Mode this SongID will be added "00" AHEAD IF SONGID IS LOWER THAN 1000 (if lower than 100 then it will be added "000" ) , Otherwise it will be added "1" AHEAD. || LXNS don't need to do anything. (DEFAULT RETURN LXNS SONGDATA)
func (requester *LxnsAliases) QueryReferSong(songAlias string) (status bool, songID int64) {
for i, dataInnner := range requester.Aliases {
for _, v := range dataInnner.Aliases {
if songAlias == v {
return true, int64(requester.Aliases[i].SongId)
// UpdateAliasPackage Use simple action to update alias.
func UpdateAliasPackage() {
// get Lxns Data
respls, err := http.Get("https://maimai.lxns.net/api/v0/maimai/alias/list")
defer respls.Body.Close()
getData, err := io.ReadAll(respls.Body)
var lxnsAliasData LxnsAliases
json.Unmarshal(getData, &lxnsAliasData)

// get Lxns Data SongListInfo
resplsSongList, err := http.Get("https://maimai.lxns.net/api/v0/maimai/song/list")
defer respls.Body.Close()
getDataSongList, err := io.ReadAll(resplsSongList.Body)
var lxnsSongListData LxnsSongListInfo
json.Unmarshal(getDataSongList, &lxnsSongListData)

// get AkiraBot AliasData
url := "https://docs.google.com/spreadsheets/d/e/2PACX-1vRwHptWLUyMG9ASCgk9MhI693jmAA1_CJrPfTxjX9J8f3wGHlR09Ja_h5i3InPbFhK1BjJp5cO_kugM/pub?output=xlsx"
response, err := http.Get(url)
if err != nil {
fmt.Println("Error fetching URL:", err)
return
}
defer response.Body.Close()
body, err := io.ReadAll(response.Body)
reader := bytes.NewReader(body)
f, err := excelize.OpenReader(reader)
if err != nil {
fmt.Println(err)
return
}
defer func() {
if err := f.Close(); err != nil {
fmt.Println(err)
}
}()
savedListMap := map[string][]string{}
getRows, err := f.GetRows("主表")
var titleStart bool
for _, rows := range getRows {
if rows[0] == "ID" {
titleStart = true
continue
}
if titleStart {
var mappedList []string
for _, rowList := range rows {
mappedList = append(mappedList, rowList)
}
savedListMap[mappedList[0]] = mappedList[1:]
}
}
// generate a json file here.
var tempList []interface{}
for i, listData := range savedListMap {
var vartiesList []int
getInt, _ := strconv.Atoi(i)
vartiesList = append(vartiesList, getInt)
var referListData []string
// check this alias in lxns network pattern, it maybe slowly(
for _, listLxns := range lxnsSongListData.Songs {
if listLxns.Title == listData[0] && listLxns.Id != getInt {
vartiesList = append(vartiesList, listLxns.Id)
}
}
// due to AkihaBot use two packed id, so make the id together.

referListData = append(referListData, listData[1:]...)
// add same alias to lxns
for _, lxnsAliasRefer := range lxnsAliasData.Aliases {
for _, listLocation := range vartiesList {
if listLocation == lxnsAliasRefer.SongId {
// prefix, add alias to it.
referListData = append(referListData, lxnsAliasRefer.Aliases...)
referListData = removeDuplicates(referListData)
}
}
}
tempList = append(tempList, &MappedListStruct{DingFishId: getInt, SongName: listData[0], Aliases: referListData, SongId: vartiesList})
}
GeneratedList := map[string]interface{}{
"aliases": tempList,
}
getBytes, err := json.Marshal(GeneratedList)
if err != nil {
panic(err)
}
os.WriteFile(engine.DataFolder()+"alias.json", getBytes, 0777)
GeneratedList = nil // revoke
}

func removeDuplicates(list []string) []string {
seen := make(map[string]bool)
var result []string
for _, item := range list {
if !seen[item] {
seen[item] = true
result = append(result, item)
}
}
return result
}

func removeIntDuplicates(list []int) []int {
seen := make(map[int]bool)
var result []int
for _, item := range list {
if !seen[item] {
seen[item] = true
result = append(result, item)
}
}
return false, 0
return result
}
Loading

0 comments on commit 700e162

Please sign in to comment.