Skip to content

Commit 19192b0

Browse files
authored
add(niuniu): 封装数据库操作 (#61)
1 parent 2a63f2f commit 19192b0

File tree

5 files changed

+1092
-0
lines changed

5 files changed

+1092
-0
lines changed

README.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@ huggingface API
1616
二次元 AI tag 作画
1717
## nsfw
1818
图片合规性审查
19+
## niu
20+
niu
1921
## pixiv
2022
P站解析与图片下载
2123
## qzone

niu/main.go

Lines changed: 382 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,382 @@
1+
// Package niu 牛牛大作战
2+
package niu
3+
4+
import (
5+
"errors"
6+
"fmt"
7+
"github.com/FloatTech/AnimeAPI/wallet"
8+
"github.com/FloatTech/floatbox/file"
9+
sql "github.com/FloatTech/sqlite"
10+
"os"
11+
"strconv"
12+
"strings"
13+
"sync"
14+
"time"
15+
)
16+
17+
var (
18+
db = &model{}
19+
globalLock sync.Mutex
20+
// ErrNoBoys 表示当前没有男孩子可用的错误。
21+
ErrNoBoys = errors.New("暂时没有男孩子哦")
22+
23+
// ErrNoGirls 表示当前没有女孩子可用的错误。
24+
ErrNoGirls = errors.New("暂时没有女孩子哦")
25+
26+
// ErrNoNiuNiu 表示用户尚未拥有牛牛的错误。
27+
ErrNoNiuNiu = errors.New("你还没有牛牛呢,快去注册吧!")
28+
29+
// ErrNoNiuNiuINAuction 表示拍卖行当前没有牛牛可用的错误。
30+
ErrNoNiuNiuINAuction = errors.New("拍卖行还没有牛牛呢")
31+
32+
// ErrNoMoney 表示用户资金不足的错误。
33+
ErrNoMoney = errors.New("你的钱不够快去赚钱吧!")
34+
35+
// ErrAdduserNoNiuNiu 表示对方尚未拥有牛牛,因此无法进行某些操作的错误。
36+
ErrAdduserNoNiuNiu = errors.New("对方还没有牛牛呢,不能🤺")
37+
38+
// ErrCannotFight 表示无法进行战斗操作的错误。
39+
ErrCannotFight = errors.New("你要和谁🤺?你自己吗?")
40+
41+
// ErrNoNiuNiuTwo 表示用户尚未拥有牛牛,无法执行特定操作的错误。
42+
ErrNoNiuNiuTwo = errors.New("你还没有牛牛呢,咋的你想凭空造一个啊")
43+
44+
// ErrAlreadyRegistered 表示用户已经注册过的错误。
45+
ErrAlreadyRegistered = errors.New("你已经注册过了")
46+
47+
// ErrInvalidPropType 表示传入的道具类别错误的错误。
48+
ErrInvalidPropType = errors.New("道具类别传入错误")
49+
50+
// ErrInvalidPropUsageScope 表示道具使用域错误的错误。
51+
ErrInvalidPropUsageScope = errors.New("道具使用域错误")
52+
53+
// ErrPropNotFound 表示找不到指定道具的错误。
54+
ErrPropNotFound = errors.New("道具不存在")
55+
)
56+
57+
func init() {
58+
if file.IsNotExist("data/niuniu") {
59+
err := os.MkdirAll("data/niuniu", 0775)
60+
if err != nil {
61+
panic(err)
62+
}
63+
}
64+
db.sql = sql.New("data/niuniu/niuniu.db")
65+
err := db.sql.Open(time.Hour * 24)
66+
if err != nil {
67+
panic(err)
68+
}
69+
}
70+
71+
// DeleteWordNiuNiu ...
72+
func DeleteWordNiuNiu(gid, uid int64) error {
73+
globalLock.Lock()
74+
defer globalLock.Unlock()
75+
return db.deleteWordNiuNiu(gid, uid)
76+
}
77+
78+
// SetWordNiuNiu length > 0 就增加 , length < 0 就减小
79+
func SetWordNiuNiu(gid, uid int64, length float64) error {
80+
globalLock.Lock()
81+
defer globalLock.Unlock()
82+
niu, err := db.getWordNiuNiu(gid, uid)
83+
if err != nil {
84+
return err
85+
}
86+
niu.Length += length
87+
return db.setWordNiuNiu(gid, niu)
88+
}
89+
90+
// GetWordNiuNiu ...
91+
func GetWordNiuNiu(gid, uid int64) (float64, error) {
92+
globalLock.Lock()
93+
defer globalLock.Unlock()
94+
95+
niu, err := db.getWordNiuNiu(gid, uid)
96+
return niu.Length, err
97+
}
98+
99+
// GetRankingInfo 获取排行信息
100+
func GetRankingInfo(gid int64, t bool) (BaseInfos, error) {
101+
globalLock.Lock()
102+
defer globalLock.Unlock()
103+
var (
104+
list users
105+
err error
106+
)
107+
niuOfGroup, err := db.getAllNiuNiuOfGroup(gid)
108+
if err != nil {
109+
if t {
110+
return nil, ErrNoBoys
111+
}
112+
return nil, ErrNoGirls
113+
}
114+
list = niuOfGroup.filter(t)
115+
f := make(BaseInfos, len(list))
116+
for i, info := range list {
117+
f[i] = BaseInfo{
118+
UID: info.UID,
119+
Length: info.Length,
120+
}
121+
}
122+
return f, nil
123+
}
124+
125+
// GetGroupUserRank 获取指定用户在群中的排名
126+
func GetGroupUserRank(gid, uid int64) (int, error) {
127+
globalLock.Lock()
128+
defer globalLock.Unlock()
129+
niu, err := db.getWordNiuNiu(gid, uid)
130+
if err != nil {
131+
return -1, err
132+
}
133+
group, err := db.getAllNiuNiuOfGroup(gid)
134+
if err != nil {
135+
return -1, err
136+
}
137+
return group.ranking(niu.Length, uid), nil
138+
}
139+
140+
// View 查看牛牛
141+
func View(gid, uid int64, name string) (*strings.Builder, error) {
142+
i, err := db.getWordNiuNiu(gid, uid)
143+
if err != nil {
144+
return nil, ErrNoNiuNiu
145+
}
146+
niuniu := i.Length
147+
var result strings.Builder
148+
sexLong := "长"
149+
sex := "♂️"
150+
if niuniu < 0 {
151+
sexLong = "深"
152+
sex = "♀️"
153+
}
154+
niuniuList, err := db.getAllNiuNiuOfGroup(gid)
155+
if err != nil {
156+
return nil, err
157+
}
158+
result.WriteString(fmt.Sprintf("\n📛%s<%s>的牛牛信息\n⭕性别:%s\n⭕%s度:%.2fcm\n⭕排行:%d\n⭕%s ",
159+
name, strconv.FormatInt(uid, 10),
160+
sex, sexLong, niuniu, niuniuList.ranking(niuniu, uid), generateRandomString(niuniu)))
161+
return &result, nil
162+
}
163+
164+
// HitGlue 打胶
165+
func HitGlue(gid, uid int64, prop string) (string, error) {
166+
niuniu, err := db.getWordNiuNiu(gid, uid)
167+
if err != nil {
168+
return "", ErrNoNiuNiuTwo
169+
}
170+
171+
messages, err := niuniu.processNiuNiuAction(prop)
172+
if err != nil {
173+
return "", err
174+
}
175+
if err = db.setWordNiuNiu(gid, niuniu); err != nil {
176+
return "", err
177+
}
178+
return messages, nil
179+
}
180+
181+
// Register 注册牛牛
182+
func Register(gid, uid int64) (string, error) {
183+
if _, err := db.getWordNiuNiu(gid, uid); err == nil {
184+
return "", ErrAlreadyRegistered
185+
}
186+
// 获取初始长度
187+
length := db.newLength()
188+
u := userInfo{
189+
UID: uid,
190+
Length: length,
191+
}
192+
if err := db.setWordNiuNiu(gid, &u); err != nil {
193+
return "", err
194+
}
195+
return fmt.Sprintf("注册成功,你的牛牛现在有%.2fcm", u.Length), nil
196+
}
197+
198+
// JJ ...
199+
func JJ(gid, uid, adduser int64, prop string) (message string, adduserLength float64, err error) {
200+
201+
myniuniu, err := db.getWordNiuNiu(gid, uid)
202+
if err != nil {
203+
return "", 0, ErrNoNiuNiu
204+
}
205+
206+
adduserniuniu, err := db.getWordNiuNiu(gid, adduser)
207+
if err != nil {
208+
return "", 0, ErrAdduserNoNiuNiu
209+
}
210+
211+
if uid == adduser {
212+
return "", 0, ErrCannotFight
213+
}
214+
215+
message, err = myniuniu.processJJuAction(adduserniuniu, prop)
216+
if err != nil {
217+
return "", 0, err
218+
}
219+
220+
if err = db.setWordNiuNiu(gid, myniuniu); err != nil {
221+
return "", 0, err
222+
}
223+
224+
if err = db.setWordNiuNiu(gid, adduserniuniu); err != nil {
225+
return "", 0, err
226+
}
227+
228+
adduserLength = adduserniuniu.Length
229+
return
230+
}
231+
232+
// Cancel 注销牛牛
233+
func Cancel(gid, uid int64) (string, error) {
234+
_, err := db.getWordNiuNiu(gid, uid)
235+
if err != nil {
236+
return "", ErrNoNiuNiuTwo
237+
}
238+
err = db.deleteWordNiuNiu(gid, uid)
239+
if err != nil {
240+
err = errors.New("遇到不可抗力因素,注销失败!")
241+
}
242+
return "注销成功,你已经没有牛牛了", err
243+
}
244+
245+
// Redeem 赎牛牛
246+
func Redeem(gid, uid int64, lastLength float64) error {
247+
money := wallet.GetWalletOf(uid)
248+
if money < 150 {
249+
var builder strings.Builder
250+
walletName := wallet.GetWalletName()
251+
builder.WriteString("赎牛牛需要150")
252+
builder.WriteString(walletName)
253+
builder.WriteString(",快去赚钱吧,目前仅有:")
254+
builder.WriteString(strconv.Itoa(money))
255+
builder.WriteString("个")
256+
builder.WriteString(walletName)
257+
return errors.New(builder.String())
258+
}
259+
260+
if err := wallet.InsertWalletOf(uid, -150); err != nil {
261+
return err
262+
}
263+
264+
niu, err := db.getWordNiuNiu(gid, uid)
265+
if err != nil {
266+
return ErrNoNiuNiu
267+
}
268+
269+
niu.Length = lastLength
270+
271+
return db.setWordNiuNiu(gid, niu)
272+
}
273+
274+
// Store 牛牛商店
275+
func Store(gid, uid int64, n int) error {
276+
info, err := db.getWordNiuNiu(gid, uid)
277+
if err != nil {
278+
return err
279+
}
280+
281+
money, err := info.purchaseItem(n)
282+
if err != nil {
283+
return err
284+
}
285+
286+
if wallet.GetWalletOf(uid) < money {
287+
return ErrNoMoney
288+
}
289+
290+
if err = wallet.InsertWalletOf(uid, -money); err != nil {
291+
return err
292+
}
293+
294+
return db.setWordNiuNiu(uid, info)
295+
}
296+
297+
// Sell 出售牛牛
298+
func Sell(gid, uid int64) (string, error) {
299+
niu, err := db.getWordNiuNiu(gid, uid)
300+
if err != nil {
301+
return "", ErrNoNiuNiu
302+
}
303+
money, t, message := profit(niu.Length)
304+
if !t {
305+
return "", errors.New(message)
306+
}
307+
err = wallet.InsertWalletOf(uid, money)
308+
if err != nil {
309+
return message, err
310+
}
311+
u := AuctionInfo{
312+
UserID: niu.UID,
313+
Length: niu.Length,
314+
Money: money * 2,
315+
}
316+
err = db.setNiuNiuAuction(gid, &u)
317+
return message, err
318+
}
319+
320+
// ShowAuction 展示牛牛拍卖行
321+
func ShowAuction(gid int64) ([]AuctionInfo, error) {
322+
globalLock.Lock()
323+
defer globalLock.Unlock()
324+
return db.getAllNiuNiuAuction(gid)
325+
}
326+
327+
// Auction 购买牛牛
328+
func Auction(gid, uid int64, i int) (string, error) {
329+
auction, err := db.getAllNiuNiuAuction(gid)
330+
if err != nil {
331+
return "", ErrNoNiuNiuINAuction
332+
}
333+
err = wallet.InsertWalletOf(uid, -auction[i].Money)
334+
if err != nil {
335+
return "", ErrNoMoney
336+
}
337+
338+
niu, err := db.getWordNiuNiu(gid, uid)
339+
if err != nil {
340+
niu = &userInfo{
341+
UID: uid,
342+
}
343+
}
344+
niu.Length = auction[i].Length
345+
346+
if auction[i].Money > 500 {
347+
niu.WeiGe += 2
348+
niu.Artifact += 2
349+
}
350+
351+
if err = db.setWordNiuNiu(gid, niu); err != nil {
352+
return "", err
353+
}
354+
err = db.deleteNiuNiuAuction(gid, auction[i].ID)
355+
if err != nil {
356+
return "", err
357+
}
358+
if auction[i].Money > 500 {
359+
return fmt.Sprintf("恭喜你购买成功,当前长度为%.2fcm,此次购买将赠送你2个伟哥,2个媚药",
360+
niu.Length), nil
361+
}
362+
return fmt.Sprintf("恭喜你购买成功,当前长度为%.2fcm", niu.Length), nil
363+
}
364+
365+
// Bag 牛牛背包
366+
func Bag(gid, uid int64) (string, error) {
367+
niu, err := db.getWordNiuNiu(gid, uid)
368+
if err != nil {
369+
return "", ErrNoNiuNiu
370+
}
371+
372+
var result strings.Builder
373+
result.Grow(100)
374+
375+
result.WriteString("当前牛牛背包如下\n")
376+
result.WriteString(fmt.Sprintf("伟哥: %v\n", niu.WeiGe))
377+
result.WriteString(fmt.Sprintf("媚药: %v\n", niu.Philter))
378+
result.WriteString(fmt.Sprintf("击剑神器: %v\n", niu.Artifact))
379+
result.WriteString(fmt.Sprintf("击剑神稽: %v\n", niu.ShenJi))
380+
381+
return result.String(), nil
382+
}

0 commit comments

Comments
 (0)