diff --git a/command.go b/command.go index 1b5f242ed72f76f7fb8b24f4458c3b9c92a3c5d1..a0a7ab01fe9415282c31169be2921fcf2b3745f3 100644 --- a/command.go +++ b/command.go @@ -1,38 +1,121 @@ package main import ( + "math/rand" + "strconv" + "time" "git.randomchars.net/freenitori/log" "git.randomchars.net/freenitori/multiplexer" ) func init() { + m.Route(&multiplexer.Route{ - Pattern: "ping", - AliasPatterns: []string{"pong"}, - Description: "ping pong.", + Pattern: "cuzdan", + AliasPatterns: []string{"cüzdan","balance","para","param","cüzdanım","bal"}, + Description: "cüzdan bilgisi", Category: system, Handler: func(context *multiplexer.Context) { - err := Database.Set("key", "hello world") + data, err := Database.Get(context.User.ID) + if err != nil && data == 0 { + err = Database.Set(context.User.ID, 1) + if err != nil { + log.Info("cannot create new key for this user") + } + } + data, err = Database.Get(context.User.ID) + if err != nil { + log.Info("Something went wrong again") + } else { + balstring := strconv.Itoa(int(data)) + context.SendMessage("Cüzdanında " + balstring + " <:valorcoin:913838260738990110> var") + } + + }, + }) + + m.Route(&multiplexer.Route{ + Pattern: "getcode", + AliasPatterns: []string{"kodal","referans", "ref", "kod"}, + Description: "referans kodu", + Category: system, + Handler: func(context *multiplexer.Context) { + + data, err := Database.Get(context.User.ID + "ref") + if err != nil && data == 0 { + randInt := rand.Intn(9999-1) + 1 + log.Info(randInt) + err = Database.Set(context.User.ID + "ref", uint64(randInt)) + if err != nil { + log.Info("cannot insert ref code") + } + } + + data, err = Database.Get(context.User.ID + "ref") if err != nil { - log.Info(err) + log.Info("Cannot get ref code") + } else { + err := Database.SaveRefCode(data, context.User.ID) + if err != nil { + log.Info("Cannot save ref code") + } + refstring := strconv.Itoa(int(data)) + context.SendMessage("Referans kodunuz `" + refstring +"` davet ettiğiniz arkadaşlarınız !kullan referanskodu yaparak hem kendileri hem siz 50 <:valorcoin:913838260738990110> kazanabilirsiniz.") } - context.Session.ChannelMessageSend(context.Channel.ID, "Pong") - log.Infof("Pong! " + context.User.Username) }, }) m.Route(&multiplexer.Route{ - Pattern: "get", - AliasPatterns: []string{"value"}, - Description: "database test.", + Pattern: "kullan", + AliasPatterns: []string{"use","gir"}, + Description: "referans kodu kullanma", Category: system, Handler: func(context *multiplexer.Context) { - data, err := Database.Get("key2") + + data, err := Database.Get(context.User.ID + "usedref") + if err != nil && data == 0 { + err = Database.Set(context.User.ID + "usedref", 0) + if err != nil { + log.Info("cannot insert usedref code") + } + } + data, err = Database.Get(context.User.ID + "usedref") + if err != nil { + log.Info("cannot get usedref code") + } + if data == 1 { + context.SendMessage("Kodunu zaten kullandın") + } + jointime, err := context.Member.JoinedAt.Parse() if err != nil { - log.Info(err) + log.Info("can't get member join time") + } else { + if time.Now().Unix() - jointime.Unix() > 153600 { + context.SendMessage("Sunucuya katıldıktan sonra 48 saat içerisinde kodu girmeniz gerekiyordu.") + } else { + refcode := context.Fields[1] + refint, err := strconv.Atoi(refcode) + if err != nil { + log.Info("cannot convert ref code") + } + data, err := Database.GetRefCode(uint64(refint)) + if err != nil || data == " " { + log.Info("can't find this ref code") + context.SendMessage("Hatalı bir kod girdiniz.") + } else { + err := Database.Add(data, 50) + if err != nil { + log.Info("cannot add 50") + } + err = Database.Add(context.User.ID, 50) + if err != nil { + log.Info("cannot add 50 to code user") + } else { + context.SendMessage("Tebrikler, siz ve arkadaşınız 50 <:valorcoin:913838260738990110> kazandınız!") + } + } + } } - context.Session.ChannelMessageSend(context.Channel.ID, "getting value " + data) - log.Infof("Nice! " + context.User.Username ) }, }) -} +} \ No newline at end of file diff --git a/config.go b/config.go index d996c55cd561d2975e46152b632a00d135d0079d..ce2229fb3f9f64ea46e793c7133bc60e70f4c1b8 100644 --- a/config.go +++ b/config.go @@ -12,11 +12,13 @@ var configPath string var defaultConfig = configPayload{ Prefix: "!", Token: "TOKEN", + DatabasePath: "DatabasePath", } type configPayload struct { Prefix string Token string + DatabasePath string } func init() { diff --git a/database.go b/database.go index 7c26c776c95241679710472a17f27cfc63d4b804..b60ff8e4bd04287b8eed95bc748cd4a5a0296d2c 100644 --- a/database.go +++ b/database.go @@ -2,6 +2,7 @@ package main import ( ldb "github.com/syndtr/goleveldb/leveldb" + "encoding/binary" ) var Database LevelDB @@ -19,22 +20,42 @@ func (db *LevelDB) Open(path string) error { return nil } -func (db *LevelDB) Get(key string) (string, error) { - +func (db *LevelDB) Get(key string) (uint64, error) { data , err := db.database.Get([]byte(key), nil) + if err != nil { + return 0, err + } + return binary.LittleEndian.Uint64(data), nil +} + +func (db *LevelDB) Set(key string, value uint64) error { + payload := make([]byte, 8) + binary.LittleEndian.PutUint64(payload, value) + return db.database.Put([]byte(key), []byte(payload), nil) +} - if err != nil { - return string(data), err - } +func (db *LevelDB) Add(key string, value uint64) error { + data , err := db.database.Get([]byte(key), nil) + if err != nil { + return err + } + payload := make([]byte, 8) + binary.LittleEndian.PutUint64(payload, binary.LittleEndian.Uint64(data) + value) + return db.database.Put([]byte(key), []byte(payload), nil) +} - return string(data), err +func (db *LevelDB) SaveRefCode(key uint64, value string) error{ + payload := make([]byte, 8) + binary.LittleEndian.PutUint64(payload, key) + return db.database.Put([]byte(payload), []byte(value), nil) } -func (db *LevelDB) Set(key, value string) error { - err := db.database.Put([]byte(key), []byte(value), nil) +func (db *LevelDB) GetRefCode(key uint64) (string, error){ + payload := make([]byte, 8) + binary.LittleEndian.PutUint64(payload, key) + data , err := db.database.Get([]byte(payload), nil) if err != nil { - return err - } else { - return nil + return " ", err } + return string(data), nil } \ No newline at end of file diff --git a/go.mod b/go.mod index a3e0a32f55f7f54c3717e2a4e6b0f61b128dcd44..4fff32f50415482c4624aa5d10a366d0b6d12d90 100644 --- a/go.mod +++ b/go.mod @@ -1,4 +1,4 @@ -module main +module git.randomchars.net/levatax/new-economy-bot go 1.17 diff --git a/handler.go b/handler.go index 88558293cfc86666d49a01eb2302a20561222fa0..493444a7d05b3efe192b571a6bf3055bb4bf54c1 100644 --- a/handler.go +++ b/handler.go @@ -1,14 +1,96 @@ package main import ( + "time" "git.randomchars.net/freenitori/log" "git.randomchars.net/freenitori/multiplexer" + "github.com/bwmarrin/discordgo" ) func init() { m.MessageCreate = append(m.MessageCreate, messageHandler) + m.VoiceStateUpdate = append(m.VoiceStateUpdate, voiceHandler) } func messageHandler(context *multiplexer.Context) { - log.Infof(context.User.Username + "#" + context.User.Discriminator + " sent the following message: " + context.Message.Content) + + data, err := Database.Get(context.User.ID) + if err != nil && data == 0 { + err = Database.Set(context.User.ID, 1) + if err != nil { + log.Info("cannot create new key for this user") + } + } + err = Database.Add(context.User.ID, 1) + if err != nil { + log.Info("cannot add 1 for messaging") + } +} + +func voiceHandler(context *multiplexer.Context) { + // Lookup channel in allowed map + if context.Channel == nil { + log.Info("Chat initiate skipped on irrelevant channel.") + data, err := Database.Get(context.User.ID+"voicejoin") + if err != nil { + log.Info(err) + } + timenow := int(time.Now().Unix()) + if err != nil { + log.Info(err) + } + duration := uint64(timenow) - data + log.Info(duration) + Database.Add(context.User.ID, duration/10) + return + } + + // Get event + var event *discordgo.VoiceStateUpdate + if e, ok := context.Event.(*discordgo.VoiceStateUpdate); !ok { + log.Info("Chat initiate skipped on incorrect event.") + return + } else { + event = e + } + if event.VoiceState != nil { + if event.VoiceState.ChannelID == "" { + log.Info("Chat initiate skipped on empty channel ID.") + return + } + } else { + log.Info("Chat initiate skipped on nil voice state.") + return + } + + // Get member from cache and add to cache if not exist + var member *discordgo.Member + if u, err := context.Session.State.Member(event.GuildID, event.UserID); err != nil { + if u, err = context.Session.GuildMember(event.GuildID, event.UserID); err != nil { + log.Errorf("Error getting member %s (%s), %s", event.UserID, event.GuildID, err) + return + } else { + member = u + _ = context.Session.State.MemberAdd(u) + } + } else { + member = u + } + if member == nil { + log.Info("Chat initiate skipped on nil member.") + return + } + + // Workaround for weird bug where the event has no guild ID + if member.GuildID == "" { + member.GuildID = event.GuildID + } + + if event.BeforeUpdate == nil { + timenow := uint64(time.Now().Unix()) + err := Database.Set(context.User.ID + "voicejoin", timenow) + if err != nil { + log.Info("cannot insert join time") + } + } } \ No newline at end of file diff --git a/main.go b/main.go index e9f6f32d904ef56156f9c4fff6ef3d4d3352c863..ec0bd0bb756545c62490daaba9d340406cddab6b 100644 --- a/main.go +++ b/main.go @@ -86,7 +86,7 @@ func main() { m.SessionRegisterHandlers(session) m.Prefix = config.Prefix m.Categories = append(m.Categories, system) - err := Database.Open("/tmp/test.db") + err := Database.Open(config.DatabasePath) if err != nil { log.Info(err) }