ain't afraid of no sleep,

This commit is contained in:
Yessiest 2022-05-20 22:20:49 +04:00
parent 38c9e580b9
commit ca17b716ba
9 changed files with 481 additions and 481 deletions

View File

@ -2,202 +2,202 @@
--P.S: air stands for Advanced Input Recognition, although technically it's not all that advanced
air = {}
air.match_strings = function(string)
local strings = {}
string = string:gsub("\"(.-[^\\])\"",function(capt)
string_id = string_id + 1
strings["%str"..string_id] = capt:gsub("\\\"","\"")
return " %str"..string_id
end)
return string,strings
local strings = {}
string = string:gsub("\"(.-[^\\])\"",function(capt)
string_id = string_id + 1
strings["%str"..string_id] = capt:gsub("\\\"","\"")
return " %str"..string_id
end)
return string,strings
end
local function parse_strings(thing,strings)
--find all strings and replace them with string ids with no spaces
local strings = strings or {}
local string_count = 0
local function get_string(text)
string_count = string_count + 1
local id = "&;"..tostring(string_count)..";&"
strings[string_count] = text
return id
end
thing = thing:gsub("(\")\"",get_string)
thing = thing:gsub("(\".-[^\\])\"",get_string)
thing = thing:gsub("(\')\'",get_string)
thing = thing:gsub("(\'.-[^\\])\'",get_string)
return thing,strings
--find all strings and replace them with string ids with no spaces
local strings = strings or {}
local string_count = 0
local function get_string(text)
string_count = string_count + 1
local id = "&;"..tostring(string_count)..";&"
strings[string_count] = text
return id
end
thing = thing:gsub("(\")\"",get_string)
thing = thing:gsub("(\".-[^\\])\"",get_string)
thing = thing:gsub("(\')\'",get_string)
thing = thing:gsub("(\'.-[^\\])\'",get_string)
return thing,strings
end
--this table will look up special types
special_case = {
["voiceChannel"] = function(id,client,guild_id)
local guild = client:getGuild(guild_id)
local channel = guild:getChannel(id:match("(%d+)[^%d]*$"))
if tostring(channel):match("^GuildVoiceChannel: ") then
return true,channel
else
return false
["voiceChannel"] = function(id,client,guild_id)
local guild = client:getGuild(guild_id)
local channel = guild:getChannel(id:match("(%d+)[^%d]*$"))
if tostring(channel):match("^GuildVoiceChannel: ") then
return true,channel
else
return false
end
end,
["textChannel"] = function(id,client,guild_id)
local guild = client:getGuild(guild_id)
local channel = guild:getChannel(id:match("(%d+)[^%d]*$"))
if tostring(channel):match("^GuildTextChannel: ") then
return true,channel
else
return false
end
end,
["messageLink"] = function(id,client,guild_id)
local guild = client:getGuild(guild_id)
local channelId,messageId = id:match("(%d+)/(%d+)[^%d]*$")
channel = guild:getChannel(channelId)
if tostring(channel):find("GuildTextChannel") then
message = channel:getMessage(messageId)
if message then
return true,message
end
end
return false
end,
["role"] = function(id,client,guild_id)
local guild = client:getGuild(guild_id)
local role = guild:getRole(id:match("(%d+)[^%d]*$"))
if role then
return true,role
else
return false
end
end,
["member"] = function(id,client,guild_id)
local guild = client:getGuild(guild_id)
local member = guild:getMember(id:match("(%d+)[^%d]*$"))
if member then
return true,member
else
return false
end
end,
["emoji"] = function(id,client,guild_id)
local guild = client:getGuild(guild_id)
local emoji = guild:getEmoji(id:match("(%d+)[^%d]*$"))
if emoji then
return true,emoji
else
return false
end
end,
["ban"] = function(id,client,guild_id)
local guild = client:getGuild(guild_id)
local ban = guild:getBan(id:match("(%d+)[^%d]*$"))
if ban then
return true,ban
else
return false
end
end,
["channel"] = function(id,client,guild_id)
local guild = client:getGuild(guild_id)
local channel = guild:getChannel(id:match("(%d+)[^%d]*$"))
if channel then
return true,channel
else
return false
end
end,
["user"] = function(id,client,guild_id)
local user = client:getUser(id:match("(%d+)[^%d]*$"))
if user then
return true,user
end
return false
end,
["id"] = function(id)
if tonumber(id:match("(%d+)[^%d]*$")) and tostring(id:match("(%d+)[^%d]*$")):len() > 10 then
return true,id
end
return false
end
end,
["textChannel"] = function(id,client,guild_id)
local guild = client:getGuild(guild_id)
local channel = guild:getChannel(id:match("(%d+)[^%d]*$"))
if tostring(channel):match("^GuildTextChannel: ") then
return true,channel
else
return false
end
end,
["messageLink"] = function(id,client,guild_id)
local guild = client:getGuild(guild_id)
local channelId,messageId = id:match("(%d+)/(%d+)[^%d]*$")
channel = guild:getChannel(channelId)
if tostring(channel):find("GuildTextChannel") then
message = channel:getMessage(messageId)
if message then
return true,message
end
end
return false
end,
["role"] = function(id,client,guild_id)
local guild = client:getGuild(guild_id)
local role = guild:getRole(id:match("(%d+)[^%d]*$"))
if role then
return true,role
else
return false
end
end,
["member"] = function(id,client,guild_id)
local guild = client:getGuild(guild_id)
local member = guild:getMember(id:match("(%d+)[^%d]*$"))
if member then
return true,member
else
return false
end
end,
["emoji"] = function(id,client,guild_id)
local guild = client:getGuild(guild_id)
local emoji = guild:getEmoji(id:match("(%d+)[^%d]*$"))
if emoji then
return true,emoji
else
return false
end
end,
["ban"] = function(id,client,guild_id)
local guild = client:getGuild(guild_id)
local ban = guild:getBan(id:match("(%d+)[^%d]*$"))
if ban then
return true,ban
else
return false
end
end,
["channel"] = function(id,client,guild_id)
local guild = client:getGuild(guild_id)
local channel = guild:getChannel(id:match("(%d+)[^%d]*$"))
if channel then
return true,channel
else
return false
end
end,
["user"] = function(id,client,guild_id)
local user = client:getUser(id:match("(%d+)[^%d]*$"))
if user then
return true,user
end
return false
end,
["id"] = function(id)
if tonumber(id:match("(%d+)[^%d]*$")) and tostring(id:match("(%d+)[^%d]*$")):len() > 10 then
return true,id
end
return false
end
}
air.parse = function(string,argmatch,client,guild_id)
local args,opts = {},{}
local string_id = 0
local strings = {}
string = string:gsub("[%s\n]+\"\"",function(capt)
string_id = string_id + 1
strings["%str"..string_id] = ""
return " %str"..string_id
end)
string = string:gsub("[%s\n]+\"(.-[^\\])\"",function(capt)
string_id = string_id + 1
strings["%str"..string_id] = capt:gsub("\\\"","\"")
return " %str"..string_id
end)
string = string:gsub("[%s\n]+%-%-(%w+)=\"\"",function(name)
opts[name] = ""
return ""
end)
string = string:gsub("[%s\n]+%-%-(%w+)=\"(.-[^\\])\"",function(name,value)
opts[name] = value:gsub("\\\"","\"")
return ""
end)
string = string:gsub("[%s\n]+%-%-(%w+)=(%S+)",function(name,value)
opts[name] = value
return ""
end)
string = string:gsub("[%s\n]+%-%-(%w+)",function(name)
opts[name] = true
return ""
end)
string = string:gsub("[%s\n]+%-(%w+)",function(args)
args:gsub(".",function(key)
opts[key] = true
local args,opts = {},{}
local string_id = 0
local strings = {}
string = string:gsub("[%s\n]+\"\"",function(capt)
string_id = string_id + 1
strings["%str"..string_id] = ""
return " %str"..string_id
end)
string = string:gsub("[%s\n]+\"(.-[^\\])\"",function(capt)
string_id = string_id + 1
strings["%str"..string_id] = capt:gsub("\\\"","\"")
return " %str"..string_id
end)
string = string:gsub("[%s\n]+%-%-(%w+)=\"\"",function(name)
opts[name] = ""
return ""
end)
string = string:gsub("[%s\n]+%-%-(%w+)=\"(.-[^\\])\"",function(name,value)
opts[name] = value:gsub("\\\"","\"")
return ""
end)
string = string:gsub("[%s\n]+%-%-(%w+)=(%S+)",function(name,value)
opts[name] = value
return ""
end)
string = string:gsub("[%s\n]+%-%-(%w+)",function(name)
opts[name] = true
return ""
end)
string = string:gsub("[%s\n]+%-(%w+)",function(args)
args:gsub(".",function(key)
opts[key] = true
end)
return ""
end)
string:gsub("([^%s\n]+)",function(match)
table.insert(args,match)
end)
return ""
end)
string:gsub("([^%s\n]+)",function(match)
table.insert(args,match)
end)
for k,v in pairs(args) do
if v:match("%%str%d+") then
if strings[v] then
args[k] = strings[v]
end
end
end
if argmatch and #argmatch > 0 then
local match,err = false
local new_args = {}
for k,v in pairs(argmatch) do
if not args[k] then
match = false
err = "Missing arguments: "..table.concat(argmatch,", ",k)
break
end
if v == "number" and tonumber(args[k]) then
match = true
new_args[k] = tonumber(args[k])
elseif v == "string" then
match = true
new_args[k] = args[k]
elseif special_case[v] then
match,new_args[k] = special_case[v](args[k],client,guild_id)
else
match = false
end
if match == false then
err = "Type mismatch for argument "..k..": "..argmatch[k].." expected."
break
end
end
for k,v in pairs(args) do
if not new_args[k] then
new_args[k] = v
end
if v:match("%%str%d+") then
if strings[v] then
args[k] = strings[v]
end
end
end
if argmatch and #argmatch > 0 then
local match,err = false
local new_args = {}
for k,v in pairs(argmatch) do
if not args[k] then
match = false
err = "Missing arguments: "..table.concat(argmatch,", ",k)
break
end
if v == "number" and tonumber(args[k]) then
match = true
new_args[k] = tonumber(args[k])
elseif v == "string" then
match = true
new_args[k] = args[k]
elseif special_case[v] then
match,new_args[k] = special_case[v](args[k],client,guild_id)
else
match = false
end
if match == false then
err = "Type mismatch for argument "..k..": "..argmatch[k].." expected."
break
end
end
for k,v in pairs(args) do
if not new_args[k] then
new_args[k] = v
end
end
return match,new_args,opts,err
else
return true,args,opts
end
return match,new_args,opts,err
else
return true,args,opts
end
end
return air

View File

@ -1,48 +1,48 @@
return function(message,overrides)
assert(type(message) == "table","table expected, got "..type(message))
assert(type(overrides) == "table","table expected for arg#2, got "..type(overrides))
local fake = {content = message.content,
author = message.author,
member = message.guild:getMember(message.author.id),
channel = message.channel,
client = message.client,
guild = message.guild,
delete = function() message:delete() end,
reply = function(thing,...)
message.channel:send(...)
end,
createdAt = message.createdAt,
_parent = message.parent,
parent = message.parent,
id = message.id,
attachment = message.attachment,
attachments = message.attachments,
cleanContent = message.cleanContent,
editedTimestamp = message.editedTimestamp,
embed = message.embed,
embeds = message.embeds,
link = message.link,
mentionedChannels = message.mentionedChannels,
mentionedEmojis = message.mentionedEmojis,
mentionedRoles = message.mentionedRoles,
mentionedUsers = message.mentionedUsers,
nonce = message.nonce,
oldContent = message.oldContent,
pinned = message.pinned,
reactions = message.reactions,
tts = message.tts,
type = message.type,
webhookId = message.webhookId,
addReaction = function(self,...)
message:addReaction(...)
end,
removeReaction = function(self,...)
message:removeReaction(...)
end,
emulated = true
}
for k,v in pairs(overrides) do
fake[k] = v
end
return fake
assert(type(message) == "table","table expected, got "..type(message))
assert(type(overrides) == "table","table expected for arg#2, got "..type(overrides))
local fake = {content = message.content,
author = message.author,
member = message.guild:getMember(message.author.id),
channel = message.channel,
client = message.client,
guild = message.guild,
delete = function() message:delete() end,
reply = function(thing,...)
message.channel:send(...)
end,
createdAt = message.createdAt,
_parent = message.parent,
parent = message.parent,
id = message.id,
attachment = message.attachment,
attachments = message.attachments,
cleanContent = message.cleanContent,
editedTimestamp = message.editedTimestamp,
embed = message.embed,
embeds = message.embeds,
link = message.link,
mentionedChannels = message.mentionedChannels,
mentionedEmojis = message.mentionedEmojis,
mentionedRoles = message.mentionedRoles,
mentionedUsers = message.mentionedUsers,
nonce = message.nonce,
oldContent = message.oldContent,
pinned = message.pinned,
reactions = message.reactions,
tts = message.tts,
type = message.type,
webhookId = message.webhookId,
addReaction = function(self,...)
message:addReaction(...)
end,
removeReaction = function(self,...)
message:removeReaction(...)
end,
emulated = true
}
for k,v in pairs(overrides) do
fake[k] = v
end
return fake
end

View File

@ -2,112 +2,112 @@
local file = {}
local json
if pcall(import,"json") then
json = import("json")
json = import("json")
elseif pcall(require,"json") then
json = require("json")
json = require("json")
end
file.safe = true
file.read = function(filename,mode)
assert(type(filename) == "string","string expected, got "..type(filename))
local mode = mode or "*a"
local temp_file,err = io.open(filename,r)
if err then
if not file.safe then error(err) else
ret_string = ""
assert(type(filename) == "string","string expected, got "..type(filename))
local mode = mode or "*a"
local temp_file,err = io.open(filename,r)
if err then
if not file.safe then error(err) else
ret_string = ""
end
else
ret_string = temp_file:read(mode)
temp_file:close()
end
else
ret_string = temp_file:read(mode)
temp_file:close()
end
return ret_string,err
return ret_string,err
end
file.write = function(filename,write)
assert(type(filename) == "string", "string expected, got "..type(filename))
assert(type(write) == "string", "string expected for argument #2, got "..type(write))
local temp_file,err = io.open(filename,"w+")
local status = false
if err then
if not file.safe then error(err) else
status = false
assert(type(filename) == "string", "string expected, got "..type(filename))
assert(type(write) == "string", "string expected for argument #2, got "..type(write))
local temp_file,err = io.open(filename,"w+")
local status = false
if err then
if not file.safe then error(err) else
status = false
end
else
temp_file:write(write)
temp_file:close()
status = true
end
else
temp_file:write(write)
temp_file:close()
status = true
end
return status,err
return status,err
end
file.exists = function(filename)
local file = io.open(filename,"r")
if file then
file:close()
return true
else
return false
end
local file = io.open(filename,"r")
if file then
file:close()
return true
else
return false
end
end
file.existsDir = function(filename)
local file = io.open(filename.."/stuff","w")
if file then
file:close()
os.remove(filename.."/stuff")
return true
else
return false
end
local file = io.open(filename.."/stuff","w")
if file then
file:close()
os.remove(filename.."/stuff")
return true
else
return false
end
end
file.ls = function(path)
if file.existsDir(path) then
local ls_handle = io.popen("ls -1 "..path,"r")
local ls_data = ls_handle:read("*a")
ls_handle:close()
return ls_data
else
return false, "No such file or directory"
end
if file.existsDir(path) then
local ls_handle = io.popen("ls -1 "..path,"r")
local ls_data = ls_handle:read("*a")
ls_handle:close()
return ls_data
else
return false, "No such file or directory"
end
end
if json then
file.readJSON = function(filename,default)
assert(type(filename) == "string","string expected, got "..type(filename))
local json_data,err = file.read(filename,"*a")
local table_data, status
if err then
if not file.safe then error(err) else
status = err
table_data = default or {}
end
else
table_data,_,err = json.decode(json_data)
if not table_data then
if not file.safe then error(err) else
status = err
table_data = default or {}
file.readJSON = function(filename,default)
assert(type(filename) == "string","string expected, got "..type(filename))
local json_data,err = file.read(filename,"*a")
local table_data, status
if err then
if not file.safe then error(err) else
status = err
table_data = default or {}
end
else
table_data,_,err = json.decode(json_data)
if not table_data then
if not file.safe then error(err) else
status = err
table_data = default or {}
end
end
end
end
return table_data, status
end
return table_data, status
end
file.writeJSON = function(filename,table_data)
assert(type(filename) == "string","string expected, got "..type(filename))
assert(type(table_data) == "table","table expected, got "..type(table_data))
local status = false
local status,json_object,_,err = pcall(function() return json.encode(table_data) end)
if not status then
if not file.safe then error(err) else
status = false
err = json_object
end
else
if json_object then
status,err = file.write(filename,json_object)
end
file.writeJSON = function(filename,table_data)
assert(type(filename) == "string","string expected, got "..type(filename))
assert(type(table_data) == "table","table expected, got "..type(table_data))
local status = false
local status,json_object,_,err = pcall(function() return json.encode(table_data) end)
if not status then
if not file.safe then error(err) else
status = false
err = json_object
end
else
if json_object then
status,err = file.write(filename,json_object)
end
end
return status, err
end
return status, err
end
end
return file

View File

@ -1,39 +1,39 @@
--Luvit's deadly sin - a library that fixes the dumbest problem in luvit
--That is, unability to load core modules from the files that were required
return function(reqfunc)
local function import(path)
local paths = { }
package.path:gsub("[^;]+",function(path)
table.insert(paths,path)
end)
local filename = path:gsub("%.","/")
local file = io.open(filename..".lua","r")
local iterator = 0
local last_filename = ""
while not file do
iterator = iterator + 1
if paths[iterator] then
file = io.open(paths[iterator]:gsub("%?",filename),"r")
last_filename = paths[iterator]
else
break
end
local function import(path)
local paths = {}
package.path:gsub("[^;]+",function(path)
table.insert(paths,path)
end)
local filename = path:gsub("%.","/")
local file = io.open(filename..".lua","r")
local iterator = 0
local last_filename = ""
while not file do
iterator = iterator + 1
if paths[iterator] then
file = io.open(paths[iterator]:gsub("%?",filename),"r")
last_filename = paths[iterator]
else
break
end
end
if not file then
return reqfunc(path)
else
content = file:read("*a")
local f,err = load(content,"import: "..filename,nil,setmetatable({
require = reqfunc,
import = import,
},{__index = _G}))
if err then
error("[import: "..filname.."] "..tostring(err))
end
return f()
end
end
if not file then
return reqfunc(path)
else
content = file:read("*a")
local func,err = load(content,"import: "..filename,nil,setmetatable({
require = reqfunc,
import = import,
},{__index = _G}))
if err then
error(err)
end
return func()
end
end
return import
return import
end
--[[
Usage:

@ -1 +1 @@
Subproject commit 9e6f09050f9ebecc4ffcea1234b920468254a79b
Subproject commit 23fcea17c2eb380b6a6b1ba848d5bc7ebdc38b05

View File

@ -1,123 +1,123 @@
local markov = {}
local function node(relations)
local node = {}
local total = 0
for k,v in pairs(relations) do
total = total + v.occurences
end
for k,v in pairs(relations) do
node[k] = {probability = v.occurences/total,occurences = v.occurences}
end
return node
local node = {}
local total = 0
for k,v in pairs(relations) do
total = total + v.occurences
end
for k,v in pairs(relations) do
node[k] = {probability = v.occurences/total,occurences = v.occurences}
end
return node
end
local function escape(str)
return str:gsub("([%%%*%(%)%^%.%[%]%+%-%$%?])","%%%1")
return str:gsub("([%%%*%(%)%^%.%[%]%+%-%$%?])","%%%1")
end
local function register_words(str,word_list)
local word_list = word_list or {}
str:gsub("%S+",function(word)
if not word_list[word] then
word_list[word] = {}
end
local current_word = word_list[word]
local escaped_word = escape(word)
str:gsub("%s+" .. escaped_word .. "%s+(%S+)",function(word2)
if not current_word[word2] then
current_word[word2] = {}
local word_list = word_list or {}
str:gsub("%S+",function(word)
if not word_list[word] then
word_list[word] = {}
end
if not current_word[word2].occurences then
current_word[word2].occurences = 1
else
current_word[word2].occurences = current_word[word2].occurences + 1
end
end)
end)
for k,v in pairs(word_list) do
word_list[k] = node(v)
end
return word_list
local current_word = word_list[word]
local escaped_word = escape(word)
str:gsub("%s+" .. escaped_word .. "%s+(%S+)",function(word2)
if not current_word[word2] then
current_word[word2] = {}
end
if not current_word[word2].occurences then
current_word[word2].occurences = 1
else
current_word[word2].occurences = current_word[word2].occurences + 1
end
end)
end)
for k,v in pairs(word_list) do
word_list[k] = node(v)
end
return word_list
end
local table_length = function(tab)
local len = 0
for k,v in pairs(tab) do
len = len + 1
end
return len
local len = 0
for k,v in pairs(tab) do
len = len + 1
end
return len
end
function markov.walk(self,start)
if not self.init then
error("Attempted to use an instance method on an uninitialized instance")
end
local random = math.random(0,1e7)/1e7
local words = {}
words.count = 0
local word = nil
if self.net[start] then
while (words.count < 1) and (table_length(self.net[start]) > 0) do
for k,v in pairs(self.net[start]) do
if (random <= v.probability) then
words.count = words.count + 1
table.insert(words,k)
end
end
random = math.random(0,1e7)/1e7
if not self.init then
error("Attempted to use method on uninitialized instances")
end
end
if words.count > 0 then
word = words[math.random(1,#words)]
end
return word
local random = math.random(0,1e7)/1e7
local words = {}
words.count = 0
local word = nil
if self.net[start] then
while (words.count < 1) and (table_length(self.net[start]) > 0) do
for k,v in pairs(self.net[start]) do
if (random <= v.probability) then
words.count = words.count + 1
table.insert(words,k)
end
end
random = math.random(0,1e7)/1e7
end
end
if words.count > 0 then
word = words[math.random(1,#words)]
end
return word
end
function markov.expand_vocabulary(self,source)
if not self.init then
error("Attempted to use an instance method on an uninitialized instance")
end
self.net = register_words(source,self.net)
if not self.init then
error("Attempted to use method on uninitialized instances")
end
self.net = register_words(source,self.net)
end
function markov.save_state(self)
return self.net
return self.net
end
function markov.load_state(self,new_state)
self.net = new_state
self.net = new_state
end
function markov.run(self,start,count)
if not self.init then
error("Attempted to use an instance method on an uninitialized instance")
end
if not start then
for k,v in pairs(self.net) do
start = k
break
if not self.init then
error("Attempted to use an instance method on an uninitialized instance")
end
end
local sequence = ""
local current_word = start
while current_word do
sequence = sequence..current_word.." "
local _,counter = sequence:gsub("(%S+)","%1")
current_word = self:walk(current_word)
if counter > (count or 200) then
sequence = sequence:sub(1,-2).."..."
break
if not start then
for k,v in pairs(self.net) do
start = k
break
end
end
end
return sequence
local sequence = ""
local current_word = start
while current_word do
sequence = sequence..current_word.." "
local _,counter = sequence:gsub("(%S+)","%1")
current_word = self:walk(current_word)
if counter > (count or 200) then
sequence = sequence:sub(1,-2).."..."
break
end
end
return sequence
end
function markov.new(str)
local self = setmetatable({},{__index = markov})
self.net = register_words(str or "")
self.init = true
return self
local self = setmetatable({},{__index = markov})
self.net = register_words(str or "")
self.init = true
return self
end
return markov

View File

@ -1,32 +1,32 @@
--string purifier library
local purify = {}
purify.purify_pings = function(msg,input)
local text = input
while text:match("<@(%D*)(%d*)>") do
local obj,id = text:match("<@(%D*)(%d*)>")
local substitution = ""
if obj:match("!") then
local member = msg.guild:getMember(id)
if member then
substitution = "@"..member.name
end
elseif obj:match("&") then
local role = msg.guild:getRole(id)
if role then
substitution = "@"..role.name
end
local text = input
while text:match("<@(%D*)(%d*)>") do
local obj,id = text:match("<@(%D*)(%d*)>")
local substitution = ""
if obj:match("!") then
local member = msg.guild:getMember(id)
if member then
substitution = "@"..member.name
end
elseif obj:match("&") then
local role = msg.guild:getRole(id)
if role then
substitution = "@"..role.name
end
end
if substitution == "" then
substitution = "<\\@"..obj..id..">"
end
text = text:gsub("<@(%D*)"..id..">",substitution)
end
if substitution == "" then
substitution = "<\\@"..obj..id..">"
end
text = text:gsub("<@(%D*)"..id..">",substitution)
end
return text
return text
end
purify.purify_escapes = function(text)
local match = "([%(%)%.%%%+%-%*%?%[%]%^%$])"
return text:gsub(match,"%%%1")
local match = "([%(%)%.%%%+%-%*%?%[%]%^%$])"
return text:gsub(match,"%%%1")
end
return purify

View File

@ -15,42 +15,42 @@ utilities.deepcopy = function(orig)
return copy
end
utilities.slice = function(list,start,list_end)
local output = {}
for I = (start or 1),(list_end or #table) do
local output = {}
for I = (start or 1),(list_end or #table) do
table.insert(output,list[I])
end
return output
end
return output
end
utilities.shallowcopy = function(orig)
local copy = {}
for k,v in pairs(orig) do
local copy = {}
for k,v in pairs(orig) do
copy[k] = v
end
return copy
end
return copy
end
--overwrite the original table's properties with new properties
utilities.overwrite = function(original,overwrite)
local new = utilities.shallowcopy(original)
for k,v in pairs(overwrite) do
local new = utilities.shallowcopy(original)
for k,v in pairs(overwrite) do
new[k] = v
end
return new
end
return new
end
--merge all objects passed as arguments into a table.
--if the object is a table, merge all of it's contents with the table
utilities.merge = function(...)
local args = {...}
local new = {}
for k,v in pairs(args) do
local args = {...}
local new = {}
for k,v in pairs(args) do
if type(v) == "table" then
for k2,v2 in pairs(v) do
for k2,v2 in pairs(v) do
table.insert(new,v2)
end
end
else
table.insert(new,v)
table.insert(new,v)
end
end
return new
end
return new
end
utilities.remove_value = function(tb,v)
local id_to_remove = nil

View File

@ -1,9 +1,9 @@
return function(sec)
local hours = math.floor(sec/3600)
local minutes = math.floor((sec - hours*3600)/60)
local seconds = sec - (hours*3600) - (minutes*60)
hours = ((hours < 10) and ("0"..hours)) or hours
minutes = ((minutes < 10) and ("0"..minutes)) or minutes
seconds = ((seconds < 10) and ("0"..seconds)) or seconds
return ((tonumber(hours) > 0 and hours..":") or "")..minutes..":"..seconds
local hours = math.floor(sec/3600)
local minutes = math.floor((sec - hours*3600)/60)
local seconds = sec - (hours*3600) - (minutes*60)
hours = ((hours < 10) and ("0"..hours)) or hours
minutes = ((minutes < 10) and ("0"..minutes)) or minutes
seconds = ((seconds < 10) and ("0"..seconds)) or seconds
return ((tonumber(hours) > 0 and hours..":") or "")..minutes..":"..seconds
end