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)
 	}