Add force_default_server config option + Add multiserver.after

master
HimbeerserverDE 2021-01-10 20:18:12 +01:00
parent f48e619b7b
commit 3994052782
11 changed files with 238 additions and 8 deletions

View File

@ -14,6 +14,8 @@ player_limit: -1
servers:
lobby:
address: "127.0.0.1:30000"
default_server: lobby
force_default_server: true
`)
// LoadConfig loads the configuration file

View File

@ -224,9 +224,6 @@ func Init(p, p2 *Peer, ignMedia bool, fin chan struct{}) {
// Process data
p2.username = pkt.Data[11:]
// Lua Callback
processJoin(p2.ID())
// Send HELLO
data := make([]byte, 13+len(p2.username))
data[0] = uint8(0x00)

25
l_after.go Normal file
View File

@ -0,0 +1,25 @@
package multiserver
import (
"log"
"time"
"github.com/yuin/gopher-lua"
)
func luaAfter(L *lua.LState) int {
t := L.ToInt(1)
f := L.ToFunction(2)
arg := L.CheckAny(3)
go func() {
time.Sleep(time.Duration(t) * time.Second)
if err := L.CallByParam(lua.P{Fn: f, NRet: 0, Protect: true}, arg); err != nil {
log.Print(err)
End(true, true)
}
}()
return 0
}

View File

@ -10,7 +10,14 @@ func luaGetConfKey(L *lua.LState) int {
if v == nil {
L.Push(lua.LNil)
} else {
L.Push(lua.LString(v.(string)))
switch v.(type) {
case bool:
L.Push(lua.LBool(v.(bool)))
case int:
L.Push(lua.LNumber(v.(int)))
case string:
L.Push(lua.LString(v.(string)))
}
}
return 1

62
l_storage.go Normal file
View File

@ -0,0 +1,62 @@
package multiserver
import (
"log"
"github.com/yuin/gopher-lua"
)
func setStorageKey(L *lua.LState) int {
k := L.ToString(1)
v := L.ToString(2)
db, err := initPluginStorageDB()
if err != nil {
log.Print(err)
return 0
}
if k != "" {
err = modOrAddPluginStorageItem(db, k, v)
if err != nil {
log.Print(err)
return 0
}
} else {
err = deletePluginStorageItem(db, k)
if err != nil {
log.Print(err)
return 0
}
}
return 0
}
func getStorageKey(L *lua.LState) int {
k := L.ToString(1)
db, err := initPluginStorageDB()
if err != nil {
log.Print(err)
L.Push(lua.LString(""))
return 1
}
v, err := readPluginStorageItem(db, k)
if err != nil {
log.Print(err)
L.Push(lua.LString(""))
return 1
}
L.Push(lua.LString(v))
return 1
}

5
lua.go
View File

@ -41,6 +41,11 @@ func InitLua() {
addLuaFunc(checkPlayerPrivs, "check_player_privs")
// config
addLuaFunc(luaGetConfKey, "get_conf_key")
// storage
addLuaFunc(setStorageKey, "set_storage_key")
addLuaFunc(getStorageKey, "get_storage_key")
// after
addLuaFunc(luaAfter, "after")
}
func CloseLua() {

View File

@ -21,10 +21,16 @@ func main() {
log.Fatal(err)
return
}
defaultSrv := multiserver.GetConfKey("default_server")
if defaultSrv == nil || fmt.Sprintf("%T", defaultSrv) != "string" {
log.Fatal("Default server name not set or not a string")
return
}
lobbyaddr := multiserver.GetConfKey("servers:lobby:address")
if lobbyaddr == nil || fmt.Sprintf("%T", lobbyaddr) != "string" {
log.Fatal("Lobby server address not set or not a string")
defaultSrvAddr := multiserver.GetConfKey("servers:" + defaultSrv.(string) + ":address")
if defaultSrvAddr == nil || fmt.Sprintf("%T", defaultSrvAddr) != "string" {
log.Fatal("Default server address not set or not a string")
return
}
@ -34,7 +40,7 @@ func main() {
return
}
srvaddr, err := net.ResolveUDPAddr("udp", lobbyaddr.(string))
srvaddr, err := net.ResolveUDPAddr("udp", defaultSrvAddr.(string))
if err != nil {
log.Fatal(err)
return

View File

@ -220,5 +220,22 @@ multiserver.register_chatcommand("p_revoke", {
multiserver.register_on_redirect_done(function(id, newsrv, success)
if not success then
multiserver.chat_send_player(id, "Could not connect you to " .. newsrv .. "!")
else
local name = multiserver.get_player_name(id)
if name and name ~= "" then
multiserver.set_storage_key("server:" .. name, newsrv)
end
end
end)
multiserver.register_on_joinplayer(function(id)
if not multiserver.get_conf_key("force_default_server") then
local name = multiserver.get_player_name(id)
if not name or name == "" then return end
local srv = multiserver.get_storage_key("server:" .. name)
if not srv or srv == "" then
srv = multiserver.get_conf_key("default_server")
end
multiserver.redirect(id, srv)
end
end)

Binary file not shown.

105
plugin_storage.go Normal file
View File

@ -0,0 +1,105 @@
package multiserver
import (
"database/sql"
"os"
_ "github.com/mattn/go-sqlite3"
)
// initPluginStorageDB opens plugin_storage.sqlite
// and creates the required tables if they don't exist
// It returns said database
func initPluginStorageDB() (*sql.DB, error) {
os.Mkdir("storage", 0775)
db, err := sql.Open("sqlite3", "storage/plugin_storage.sqlite")
if err != nil {
return nil, err
}
if db == nil {
panic("DB is nil")
}
sql_table := `CREATE TABLE IF NOT EXISTS storage (
key VARCHAR(512) NOT NULL,
value VARCHAR(512) NOT NULL
);
`
_, err = db.Exec(sql_table)
if err != nil {
return nil, err
}
return db, nil
}
// modOrAddPluginStorageItem updates a plugin storage DB entry
// and inserts it if it doesn't exist
func modOrAddPluginStorageItem(db *sql.DB, key, value string) error {
deletePluginStorageItem(db, key)
sql_addPluginStorageItem := `INSERT INTO storage (
key,
value
) VALUES (
?,
?
);
`
stmt, err := db.Prepare(sql_addPluginStorageItem)
if err != nil {
return err
}
defer stmt.Close()
_, err = stmt.Exec(key, value)
if err != nil {
return err
}
return nil
}
// readPluginStorageItem selects and reads a plugin storage DB entry
func readPluginStorageItem(db *sql.DB, key string) (string, error) {
sql_readPluginStorageItem := `SELECT value FROM storage WHERE key = ?;`
stmt, err := db.Prepare(sql_readPluginStorageItem)
if err != nil {
return "", err
}
defer stmt.Close()
rows, err := stmt.Query(key)
if err != nil {
return "", err
}
var r string
for rows.Next() {
err = rows.Scan(&r)
}
return r, nil
}
// deletePluginStorageItem deletes a plugin storage DB entry
func deletePluginStorageItem(db *sql.DB, key string) error {
sql_deletePluginStorageItem := `DELETE FROM storage WHERE key = ?;`
stmt, err := db.Prepare(sql_deletePluginStorageItem)
if err != nil {
return err
}
defer stmt.Close()
_, err = stmt.Exec(key)
if err != nil {
return err
}
return nil
}

View File

@ -41,6 +41,10 @@ func Proxy(src, dst *Peer) {
if pkt.Data[0] == uint8(0x00) && pkt.Data[1] == uint8(0x31) && src.IsSrv() {
pkt.Data = processAORmAdd(dst, pkt.Data)
}
// Client ready
if pkt.Data[0] == uint8(0x00) && pkt.Data[1] == uint8(0x43) && !src.IsSrv() {
go processJoin(src.ID())
}
// Forward
if _, err := dst.Send(pkt); err != nil {