From a210859041492af753734a44cf76e6bb2a782346 Mon Sep 17 00:00:00 2001 From: vilmibm Date: Thu, 15 Dec 2022 00:14:22 -0800 Subject: [PATCH] start lua planning --- go.mod | 1 + go.sum | 2 ++ server/cmd/main.go | 9 +++++++++ server/db/schema.sql | 1 + 4 files changed, 13 insertions(+) diff --git a/go.mod b/go.mod index 5e66171..3899ffd 100644 --- a/go.mod +++ b/go.mod @@ -26,6 +26,7 @@ require ( github.com/mattn/go-runewidth v0.0.13 // indirect github.com/pkg/errors v0.9.1 // indirect github.com/rivo/uniseg v0.2.0 // indirect + github.com/yuin/gopher-lua v0.0.0-20221210110428-332342483e3f // indirect golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97 // indirect golang.org/x/net v0.0.0-20210226172049-e18ecbb05110 // indirect golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1 // indirect diff --git a/go.sum b/go.sum index f5324ec..83b792d 100644 --- a/go.sum +++ b/go.sum @@ -164,6 +164,8 @@ github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81P github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/yuin/gopher-lua v0.0.0-20221210110428-332342483e3f h1:wihIB0V/mGpVYrL8I7n/WxVqWnP07CBXZ5uCgxUP1tI= +github.com/yuin/gopher-lua v0.0.0-20221210110428-332342483e3f/go.mod h1:GBR0iDaNXjAgGg9zfCvksxSRnQx76gclCIb7kdAd1Pw= github.com/zenazn/goji v0.9.0/go.mod h1:7S9M489iMyHBNxwZnk9/EHS098H4/F6TATF2mIxtB1Q= go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= diff --git a/server/cmd/main.go b/server/cmd/main.go index 75fb0cd..267d065 100644 --- a/server/cmd/main.go +++ b/server/cmd/main.go @@ -22,6 +22,15 @@ var ( port = flag.Int("port", 6666, "The server port") ) +/* + I'm going to take a much simpler approach to scripts than I did in tildemush: objects just get one text column with no revision tracking. to avoid re-parsing scripts per verb check (as every overheard verb has to be checked against an object's script every verb utterance) i want an in-memory cache of lua states. i'm not actually sure if the goroutine unsafety is a problem for that. if it is, i can put goroutines in memory and send them verbs over channels. annoying, but should work if i have to. going to start with a naive map of object ids to scripts, re-parsing them if they get edited and updating the cache. + + The cache will grow without bound as users enter rooms with objects. they ought to be garbage collected. i can do that in a goroutine though (check DB for objects in rooms with no players). One complication will be when I have "cron" support for objects. they will need to be "live" (ie, their scripts executable) in order to do their periodic tasks. + + An idea I just had for a cron system: respond to a "tick" verb. at server start, once all in-world objects get parsed, start emitting "tick" events from a for loop in a goroutine in rooms with objects. this can be optimized for having a way to flag periodic-able objects so they don't get the verb if they wouldn't respond. + +*/ + func _main() (err error) { l, err := net.Listen("tcp", fmt.Sprintf(":%d", *port)) if err != nil { diff --git a/server/db/schema.sql b/server/db/schema.sql index 2cb73ff..1bb6f37 100644 --- a/server/db/schema.sql +++ b/server/db/schema.sql @@ -17,6 +17,7 @@ CREATE TABLE objects ( avatar boolean NOT NULL DEFAULT FALSE, bedroom boolean NOT NULL DEFAULT FALSE, data jsonb NOT NULL, + script text, owner integer REFERENCES accounts ON DELETE RESTRICT );