Skip to content

Commit 8383f5b

Browse files
authored
Merge Grape from AtomicGmod/develop
feat(core): add network library
2 parents 77073da + c873eb9 commit 8383f5b

11 files changed

Lines changed: 465 additions & 73 deletions

File tree

lua/atomic/libraries/class.lua

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,8 @@ end
5555
---@param name string
5656
---@param packageOrId? Atomic.Package | string
5757
---@param packageVersion? string
58-
---@return Atomic.Class?
58+
---@generic T
59+
---@return T: Atomic.Class?
5960
function atomic.class.get(name, packageOrId, packageVersion)
6061
local pkgName = type(packageOrId) == "table" and packageOrId.id
6162
or type(packageOrId) == "string" and packageOrId
@@ -107,11 +108,13 @@ function atomic.class.accessors(class, ...)
107108
local vars = {...}
108109

109110
for _, var in ipairs(vars) do
110-
class["get" .. var] = function(self)
111+
local varCapped = var:sub(1,1):upper() .. var:sub(2)
112+
113+
class["get" .. varCapped] = function(self)
111114
return self[var]
112115
end
113116

114-
class["set" .. var] = function(self, value)
117+
class["set" .. varCapped] = function(self, value)
115118
self[var] = value
116119
end
117120
end
@@ -135,5 +138,15 @@ function atomic.class.register(class, package)
135138
---@diagnostic disable-next-line
136139
storage[id][version][class._name] = class
137140

141+
atomic.class._storage = storage
142+
end
143+
144+
function atomic.class.unregister(class, package)
145+
local storage = atomic.class._storage
146+
local id, version = package.id, package.version
147+
148+
---@diagnostic disable-next-line
149+
storage[id][version][class._name] = nil
150+
138151
atomic.class._storage = storage
139152
end
Lines changed: 20 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -1,51 +1,29 @@
1-
---@alias Atomic.Command.ArgumentKind "number" | "string" | "time" | "player"
1+
---@alias Atomic.Command.ArgumentKind "number" | "string" | "boolean" | "time" | "player"
22
---@alias Atomic.Command.ExecuteFunc function(executor: Player, arguments: table<string, Atomic.Command.ArgumentKind): string?
33

4-
---@class Atomic.Command
5-
---@field name string
6-
---@field permission string
7-
---@field arguments {[1]: string, [2]: Atomic.Command.ArgumentKind}[]
4+
---@class Atomic.Command: Atomic.Class
5+
---@field private _name string
6+
---@field private _permission string
7+
---@field private _arguments {[1]: string, [2]: Atomic.Command.ArgumentKind}[]
88
---@field private _execute Atomic.Command.ExecuteFunc
99
---@field private _enabled boolean Internal
10-
11-
atomic.command = {
12-
---@type table<string, Atomic.Command>
13-
logger = atomic.logger.new("atomic.command"),
14-
_storage = {}
15-
}
16-
17-
---@class Atomic.Command
18-
local command = {}
19-
command.__index = command
10+
local command = atomic.class.create("Command")
11+
atomic.class.register(command, atomic.class.pseudo)
2012

2113
---@param name string
2214
---@param permission string
23-
function atomic.command.new(name, permission)
24-
return setmetatable({ name = name, permission = permission, arguments = {}, enabled = true }, command)
25-
end
26-
27-
---@param name string
28-
---@param command Atomic.Command
29-
function atomic.command.add(name, command)
30-
atomic.command._storage[name] = command
31-
end
32-
33-
---@param name string
34-
---@return Atomic.Command?
35-
function atomic.command.get(name)
36-
return atomic.command._storage[name]
37-
end
38-
39-
---@param name string
40-
function atomic.command.remove(name)
41-
atomic.command._storage[name] = nil
15+
function command:init(name, permission)
16+
self._name = name
17+
self._permission = permission
18+
self._arguments = {}
19+
self._enabled = true
4220
end
4321

4422
---@param name string
4523
---@param kind Atomic.Command.ArgumentKind
4624
---@return self
4725
function command:argument(name, kind)
48-
self.arguments[#self.arguments + 1] = { name, kind }
26+
self._arguments[#self._arguments + 1] = { name, kind }
4927

5028
return self
5129
end
@@ -62,7 +40,7 @@ end
6240
---@param msg string
6341
local function sayToPlayer(player, msg)
6442
if (IsValid(player)) then
65-
player:ChatPrint(msg)
43+
player:ChatPrint(language.GetPhrase(msg))
6644
else
6745
atomic.command.logger:error("Failed to execute command due to: %s", msg)
6846
end
@@ -86,23 +64,22 @@ end
8664
---@private
8765
---@param executor Player
8866
---@param arguments table<string, Atomic.Command.ArgumentKind>
89-
---@return thread
9067
function command:doExecute(executor, arguments)
91-
local thread = coroutine.create(function()
68+
if (not self._enabled) then
69+
return
70+
end
71+
72+
coroutine.start(function()
9273
local couldExecute = hook.Run("CouldPlayerExecuteCommand", executor, self)
9374

94-
if (!couldExecute or hasRightToExecute(executor, self.permission)) then
75+
if (!couldExecute or hasRightToExecute(executor, self._permission)) then
9576
return sayToPlayer(executor, "#atomic.no_perms")
9677
end
9778

9879
local err = self._execute(executor, arguments)
9980

10081
sayToPlayer(executor, err)
10182
end)
102-
103-
coroutine.resume(thread)
104-
105-
return thread
10683
end
10784

10885
---@param b boolean
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
atomic.command = {
2+
---@type table<string, Atomic.Command>
3+
logger = atomic.logger.new("command"),
4+
_storage = {}
5+
}
6+
7+
---@include
8+
atomic.loader.server("class.lua")
9+
10+
---@type Atomic.Command
11+
local commandClass = atomic.class.get("Command", atomic.class.pseudo)
12+
13+
---@param name string
14+
---@param permission string
15+
---@return Atomic.Command
16+
function atomic.command.new(name, permission)
17+
return atomic.class.new(commandClass, nil, name, permission)
18+
end
19+
20+
---@param name string
21+
---@param command Atomic.Command
22+
function atomic.command.add(name, command)
23+
atomic.command._storage[name] = command
24+
end
25+
26+
---@param name string
27+
---@return Atomic.Command
28+
function atomic.command.get(name)
29+
return atomic.command._storage[name]
30+
end
31+
32+
---@param name string
33+
function atomic.command.remove(name)
34+
atomic.command._storage[name] = nil
35+
end
36+
37+
---@param command string
38+
---@vararg any
39+
---@return table<string, any>
40+
-- function atomic.command.toArgumentsTable(command, ...)
41+
-- local cmd = atomic.command.get(command)
42+
-- local args = cmd._arguments
43+
44+
-- for _, type in ipairs(args) do
45+
46+
-- end
47+
-- end

lua/atomic/libraries/loader.lua

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
atomic.loader = atomic.loader or {
2-
logger = atomic.logger.new("atomic.loader")
2+
logger = atomic.logger.new("loader")
33
}
44

55
---@param path string

lua/atomic/libraries/mysql.lua

Lines changed: 7 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ if (file.Size("data/atomic/mysql/credentials.json", "GAME") <= 0) then
2424
}]];
2525

2626
file.Write("atomic/mysql/credentials.json", defaultJson)
27-
logger:warn("The `credentials.json` file has just been created in `data/atomic/mysql/` folder. To work with MySQL, fill in the database connection credentials in this file.")
27+
logger:warn("the `credentials.json` file has just been created in `data/atomic/mysql/` folder. to work with MySQL, fill in the database connection credentials in this file.")
2828
end
2929

3030
---@class Atomic.MySQL.Credentials
@@ -46,15 +46,15 @@ if (autoconnect:GetBool() and not atomic.mysql._database) then
4646
)
4747

4848
atomic.mysql._database.onConnected = function(_)
49-
logger:info("Successfully connected to the MySQL database")
49+
logger:info("successfully connected to the MySQL database")
5050
end
5151

5252
atomic.mysql._database.onConnectionFailed = function(_, err)
53-
logger:err("Error while connecting to database: %s", err)
53+
logger:err("error while connecting to database: %s", err)
5454
end
5555

5656
atomic.mysql._database.onError = function(_, err, sql)
57-
logger:debug("Error executing query `%s`: %s", sql, err)
57+
logger:debug("error executing query `%s`: %s", sql, err)
5858
end
5959

6060
atomic.mysql._database:connect()
@@ -90,18 +90,13 @@ end
9090
function atomic.mysql.query(query, ...)
9191
local co = coroutine.get()
9292

93-
local result, error
9493
local prepared = atomic.mysql._database:prepare(query)
9594
prepared.onSuccess = function(_, data)
96-
result = data
97-
98-
coroutine.resume(co)
95+
coroutine.resume(co, data)
9996
end
10097

10198
prepared.onError = function(_, err)
102-
error = err
103-
104-
coroutine.resume(co)
99+
coroutine.resume(co, nil, err)
105100
end
106101

107102
for index, value in ipairs({...}) do
@@ -111,7 +106,5 @@ function atomic.mysql.query(query, ...)
111106

112107
prepared:start()
113108

114-
coroutine.yield()
115-
116-
return result, error
109+
return coroutine.yield()
117110
end

0 commit comments

Comments
 (0)