Add force_default_server config option + Add multiserver.after
parent
f48e619b7b
commit
3994052782
|
@ -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
|
||||
|
|
3
init.go
3
init.go
|
@ -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)
|
||||
|
|
|
@ -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
|
||||
}
|
|
@ -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
|
||||
|
|
|
@ -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
5
lua.go
|
@ -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() {
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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.
|
@ -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
|
||||
}
|
4
proxy.go
4
proxy.go
|
@ -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 {
|
||||
|
|
Loading…
Reference in New Issue