Module System
CONTROL uses a custom module system. Entry points are *.main.lua or *.main.module files.
Entry Point
| Format | Description |
|---|---|
{moduleName}.main.lua |
Plain Lua source |
{moduleName}.main.module |
Encrypted precompiled module |
Folder Convention
Use modules/{moduleName}/{moduleName}.main.lua:
modules/
└── my_first_module/
└── my_first_module.main.lua
The folder name matches the module name. The engine searches recursively (depth 3) for entry files.
require Behavior
Path Resolution
require("utils.logger")→utils/logger.lua(relative to project root)- Dot notation becomes path separators
Depth Limit
Maximum depth: 3. Paths with more than 3 / segments fail:
require("a.b.c.d") -- fails: depth exceeds 3
require("a.b.c") -- ok
Restrictions
- No directory traversal:
..is forbidden - Caching: Modules are cached per path; second
requirereturns cached result - Sandbox:
load,loadfile,dofile,module,collectgarbageare removed
Example Module
-- utils/logger.lua
local logger = {}
function logger.info(message)
Log("[Bot] " .. message)
end
return logger
Usage: local logger = require("utils.logger") then logger.info("Hello").
Encrypted Modules
For distribution and code protection, use .module files:
- Compile your project with the CONTROL module compiler
- Contact via Discord for project encryption and packaging (invite link to be added)
Encrypted modules are loaded as .main.module instead of .main.lua.