1
0
mirror of https://github.com/ComfyFactory/ComfyFactorio.git synced 2025-11-29 22:47:52 +02:00

fix groups

check if a group is nil
added Public.alphanumeric(value)
This commit is contained in:
Gerkiz
2020-06-23 19:33:00 +02:00
parent aeb06fdabc
commit 932a41e55e

View File

@@ -1,222 +1,307 @@
-- this script adds a group button to create groups for your players -- -- this script adds a group button to create groups for your players --
local Tabs = require 'comfy_panel.main' local Tabs = require 'comfy_panel.main'
local Global = require 'utils.global'
local build_group_gui = (function (player, frame) local this = {
local group_name_width = 150 player_group = {},
local description_width = 240 join_spam_protection = {},
local members_width = 90 tag_groups = {},
local member_columns = 3 alphanumeric = true
local actions_width = 80 }
local total_height = frame.style.minimal_height - 60
frame.clear() Global.register(
this,
function(t)
this = t
end
)
local t = frame.add({type = "table", column_count = 5}) local Public = {}
local headings = {{"Title", group_name_width}, {"Description", description_width}, {"Members", members_width * member_columns}, {"", actions_width}}
for _, h in pairs (headings) do
local l = t.add({ type = "label", caption = h[1]})
l.style.font_color = { r=0.98, g=0.66, b=0.22}
l.style.font = "default-listbox"
l.style.top_padding = 6
l.style.minimal_height = 40
l.style.minimal_width = h[2]
l.style.maximal_width = h[2]
end
local scroll_pane = frame.add({ type = "scroll-pane", name = "scroll_pane", direction = "vertical", horizontal_scroll_policy = "never", vertical_scroll_policy = "auto"}) local build_group_gui = (function(player, frame)
scroll_pane.style.maximal_height = total_height - 50 local group_name_width = 150
scroll_pane.style.minimal_height = total_height - 50 local description_width = 240
local members_width = 90
local member_columns = 3
local actions_width = 80
local total_height = frame.style.minimal_height - 60
local t = scroll_pane.add({type = "table", name = "groups_table", column_count = 4}) frame.clear()
for _, h in pairs (headings) do
local l = t.add({ type = "label", caption = ""})
l.style.minimal_width = h[2]
l.style.maximal_width = h[2]
end
for _, group in pairs (global.tag_groups) do local t = frame.add({type = 'table', column_count = 5})
local headings = {
{'Title', group_name_width},
{'Description', description_width},
{'Members', members_width * member_columns},
{'', actions_width}
}
for _, h in pairs(headings) do
local l = t.add({type = 'label', caption = h[1]})
l.style.font_color = {r = 0.98, g = 0.66, b = 0.22}
l.style.font = 'default-listbox'
l.style.top_padding = 6
l.style.minimal_height = 40
l.style.minimal_width = h[2]
l.style.maximal_width = h[2]
end
local l = t.add({ type = "label", caption = group.name}) local scroll_pane =
l.style.font = "default-bold" frame.add(
l.style.top_padding = 16 {
l.style.bottom_padding = 16 type = 'scroll-pane',
l.style.minimal_width = group_name_width name = 'scroll_pane',
l.style.maximal_width = group_name_width direction = 'vertical',
local color = game.players[group.founder].color horizontal_scroll_policy = 'never',
color = {r = color.r * 0.6 + 0.4, g = color.g * 0.6 + 0.4, b = color.b * 0.6 + 0.4, a = 1} vertical_scroll_policy = 'auto'
l.style.font_color = color }
l.style.single_line = false )
scroll_pane.style.maximal_height = total_height - 50
scroll_pane.style.minimal_height = total_height - 50
local l = t.add({ type = "label", caption = group.description}) local t = scroll_pane.add({type = 'table', name = 'groups_table', column_count = 4})
l.style.top_padding = 16 for _, h in pairs(headings) do
l.style.bottom_padding = 16 local l = t.add({type = 'label', caption = ''})
l.style.minimal_width = description_width l.style.minimal_width = h[2]
l.style.maximal_width = description_width l.style.maximal_width = h[2]
l.style.font_color = {r = 0.90, g = 0.90, b = 0.90} end
l.style.single_line = false
local tt = t.add({ type = "table", column_count = member_columns}) for _, group in pairs(this.tag_groups) do
for _, p in pairs (game.connected_players) do if (group.name and group.founder and group.description) then
if group.name == global.player_group[p.name] then log(serpent.block(group))
local l = tt.add({ type = "label", caption = p.name}) local l = t.add({type = 'label', caption = group.name})
local color = {r = p.color.r * 0.6 + 0.4, g = p.color.g * 0.6 + 0.4, b = p.color.b * 0.6 + 0.4, a = 1} l.style.font = 'default-bold'
l.style.font_color = color l.style.top_padding = 16
--l.style.minimal_width = members_width l.style.bottom_padding = 16
l.style.maximal_width = members_width * 2 l.style.minimal_width = group_name_width
end l.style.maximal_width = group_name_width
end local color = game.players[group.founder].color
color = {r = color.r * 0.6 + 0.4, g = color.g * 0.6 + 0.4, b = color.b * 0.6 + 0.4, a = 1}
l.style.font_color = color
l.style.single_line = false
local l = t.add({type = 'label', caption = group.description})
l.style.top_padding = 16
l.style.bottom_padding = 16
l.style.minimal_width = description_width
l.style.maximal_width = description_width
l.style.font_color = {r = 0.90, g = 0.90, b = 0.90}
l.style.single_line = false
local tt = t.add({ type = "table", name = group.name, column_count = 1}) local tt = t.add({type = 'table', column_count = member_columns})
if group.name ~= global.player_group[player.name] then for _, p in pairs(game.connected_players) do
local b = tt.add({ type = "button", caption = "Join"}) if group.name == this.player_group[p.name] then
b.style.font = "default-bold" local l = tt.add({type = 'label', caption = p.name})
b.style.minimal_width = actions_width local color = {
b.style.maximal_width = actions_width r = p.color.r * 0.6 + 0.4,
else g = p.color.g * 0.6 + 0.4,
local b = tt.add({ type = "button", caption = "Leave"}) b = p.color.b * 0.6 + 0.4,
b.style.font = "default-bold" a = 1
b.style.minimal_width = actions_width }
b.style.maximal_width = actions_width l.style.font_color = color
end --l.style.minimal_width = members_width
if player.admin == true or group.founder == player.name then l.style.maximal_width = members_width * 2
local b = tt.add({ type = "button", caption = "Delete"}) end
b.style.font = "default-bold" end
b.style.minimal_width = actions_width
b.style.maximal_width = actions_width
else
local l = tt.add({ type = "label", caption = ""})
l.style.minimal_width = actions_width
l.style.maximal_width = actions_width
end
end
local frame2 = frame.add({type = "frame", name = "frame2"}) local tt = t.add({type = 'table', name = group.name, column_count = 1})
local t = frame2.add({type = "table", name = "group_table", column_count = 3}) if group.name ~= this.player_group[player.name] then
local textfield = t.add({ type = "textfield", name = "new_group_name", text = "Name" }) local b = tt.add({type = 'button', caption = 'Join'})
textfield.style.minimal_width = 200 b.style.font = 'default-bold'
local textfield = t.add({ type = "textfield", name = "new_group_description", text = "Description" }) b.style.minimal_width = actions_width
textfield.style.minimal_width = 400 b.style.maximal_width = actions_width
local b = t.add({type = "button", name = "create_new_group", caption = "Create"}) else
b.style.minimal_width = 150 local b = tt.add({type = 'button', caption = 'Leave'})
b.style.font = "default-bold" b.style.font = 'default-bold'
b.style.minimal_width = actions_width
b.style.maximal_width = actions_width
end
if player.admin == true or group.founder == player.name then
local b = tt.add({type = 'button', caption = 'Delete'})
b.style.font = 'default-bold'
b.style.minimal_width = actions_width
b.style.maximal_width = actions_width
else
local l = tt.add({type = 'label', caption = ''})
l.style.minimal_width = actions_width
l.style.maximal_width = actions_width
end
end
end
local frame2 = frame.add({type = 'frame', name = 'frame2'})
local t = frame2.add({type = 'table', name = 'group_table', column_count = 3})
local textfield = t.add({type = 'textfield', name = 'new_group_name', text = 'Name'})
textfield.style.minimal_width = 200
local textfield = t.add({type = 'textfield', name = 'new_group_description', text = 'Description'})
textfield.style.minimal_width = 400
local b = t.add({type = 'button', name = 'create_new_group', caption = 'Create'})
b.style.minimal_width = 150
b.style.font = 'default-bold'
end) end)
local function refresh_gui() local function refresh_gui()
for _, p in pairs(game.connected_players) do for _, p in pairs(game.connected_players) do
local frame = Tabs.comfy_panel_get_active_frame(p) local frame = Tabs.comfy_panel_get_active_frame(p)
if frame then if frame then
if frame.name == "Groups" then if frame.name == 'Groups' then
local new_group_name = frame.frame2.group_table.new_group_name.text local new_group_name = frame.frame2.group_table.new_group_name.text
local new_group_description = frame.frame2.group_table.new_group_description.text local new_group_description = frame.frame2.group_table.new_group_description.text
build_group_gui(p, frame) build_group_gui(p, frame)
local frame = Tabs.comfy_panel_get_active_frame(p) local frame = Tabs.comfy_panel_get_active_frame(p)
frame.frame2.group_table.new_group_name.text = new_group_name frame.frame2.group_table.new_group_name.text = new_group_name
frame.frame2.group_table.new_group_description.text = new_group_description frame.frame2.group_table.new_group_description.text = new_group_description
end end
end end
end end
end end
local function on_player_joined_game(event) local function on_player_joined_game(event)
local player = game.players[event.player_index] local player = game.players[event.player_index]
if not global.player_group then global.player_group = {} end
if not global.player_group[player.name] then global.player_group[player.name] = "[Group]" end if not this.player_group[player.name] then
if not global.join_spam_protection then global.join_spam_protection = {} end this.player_group[player.name] = '[Group]'
if not global.join_spam_protection[player.name] then global.join_spam_protection[player.name] = game.tick end end
if not global.tag_groups then global.tag_groups = {} end
if not this.join_spam_protection[player.name] then
this.join_spam_protection[player.name] = game.tick
end
end
local function alphanumeric(str)
return (string.match(str, '[^%w]') ~= nil)
end end
local function on_gui_click(event) local function on_gui_click(event)
if not event then return end if not event then
if not event.element then return end return
if not event.element.valid then return end end
if not event.element then
return
end
if not event.element.valid then
return
end
local player = game.players[event.element.player_index] local player = game.players[event.element.player_index]
local name = event.element.name local name = event.element.name
local frame = Tabs.comfy_panel_get_active_frame(player) local frame = Tabs.comfy_panel_get_active_frame(player)
if not frame then return end if not frame then
if frame.name ~= "Groups" then return end return
end
if frame.name ~= 'Groups' then
return
end
if name == "create_new_group" then if name == 'create_new_group' then
local new_group_name = frame.frame2.group_table.new_group_name.text local new_group_name = frame.frame2.group_table.new_group_name.text
local new_group_description = frame.frame2.group_table.new_group_description.text local new_group_description = frame.frame2.group_table.new_group_description.text
if new_group_name ~= "" and new_group_name ~= "Name" and new_group_description ~= "Description" then if new_group_name ~= '' and new_group_name ~= 'Name' and new_group_description ~= 'Description' then
if this.alphanumeric then
if alphanumeric(new_group_name) then
player.print('Group name is not valid.', {r = 0.90, g = 0.0, b = 0.0})
return
end
if string.len(new_group_name) > 64 then if alphanumeric(new_group_description) then
player.print("Group name is too long. 64 characters maximum.", { r=0.90, g=0.0, b=0.0}) player.print('Group description is not valid.', {r = 0.90, g = 0.0, b = 0.0})
return return
end end
end
if string.len(new_group_description) > 128 then if string.len(new_group_name) > 64 then
player.print("Description is too long. 128 characters maximum.", { r=0.90, g=0.0, b=0.0}) player.print('Group name is too long. 64 characters maximum.', {r = 0.90, g = 0.0, b = 0.0})
return return
end end
global.tag_groups[new_group_name] = {name = new_group_name, description = new_group_description, founder = player.name} if string.len(new_group_description) > 128 then
local color = {r = player.color.r * 0.7 + 0.3, g = player.color.g * 0.7 + 0.3, b = player.color.b * 0.7 + 0.3, a = 1} player.print('Description is too long. 128 characters maximum.', {r = 0.90, g = 0.0, b = 0.0})
game.print(player.name .. " has founded a new group!", color) return
game.print('>> ' .. new_group_name, { r=0.98, g=0.66, b=0.22}) end
game.print(new_group_description, { r=0.85, g=0.85, b=0.85})
frame.frame2.group_table.new_group_name.text = "Name" this.tag_groups[new_group_name] = {
frame.frame2.group_table.new_group_description.text = "Description" name = new_group_name,
refresh_gui() description = new_group_description,
return founder = player.name
end }
end local color = {
r = player.color.r * 0.7 + 0.3,
g = player.color.g * 0.7 + 0.3,
b = player.color.b * 0.7 + 0.3,
a = 1
}
game.print(player.name .. ' has founded a new group!', color)
game.print('>> ' .. new_group_name, {r = 0.98, g = 0.66, b = 0.22})
game.print(new_group_description, {r = 0.85, g = 0.85, b = 0.85})
local p = event.element.parent frame.frame2.group_table.new_group_name.text = 'Name'
if p then p = p.parent end frame.frame2.group_table.new_group_description.text = 'Description'
if p then refresh_gui()
if p.name == "groups_table" then return
if event.element.type == "button" and event.element.caption == "Join" then end
global.player_group[player.name] = event.element.parent.name end
local str = "[" .. event.element.parent.name
str = str .. "]"
player.tag = str
if game.tick - global.join_spam_protection[player.name] > 600 then
local color = {r = player.color.r * 0.7 + 0.3, g = player.color.g * 0.7 + 0.3, b = player.color.b * 0.7 + 0.3, a = 1}
game.print(player.name .. ' has joined group "' .. event.element.parent.name .. '"', color)
global.join_spam_protection[player.name] = game.tick
end
refresh_gui()
return
end
if event.element.type == "button" and event.element.caption == "Delete" then local p = event.element.parent
for _, p in pairs(game.players) do if p then
if global.player_group[p.name] then p = p.parent
if global.player_group[p.name] == event.element.parent.name then end
global.player_group[p.name] = "[Group]" if p then
p.tag = "" if p.name == 'groups_table' then
end if event.element.type == 'button' and event.element.caption == 'Join' then
end this.player_group[player.name] = event.element.parent.name
end local str = '[' .. event.element.parent.name
game.print(player.name .. ' deleted group "' .. event.element.parent.name .. '"') str = str .. ']'
global.tag_groups[event.element.parent.name] = nil player.tag = str
refresh_gui() if game.tick - this.join_spam_protection[player.name] > 600 then
return local color = {
end r = player.color.r * 0.7 + 0.3,
g = player.color.g * 0.7 + 0.3,
b = player.color.b * 0.7 + 0.3,
a = 1
}
game.print(player.name .. ' has joined group "' .. event.element.parent.name .. '"', color)
this.join_spam_protection[player.name] = game.tick
end
refresh_gui()
return
end
if event.element.type == "button" and event.element.caption == "Leave" then if event.element.type == 'button' and event.element.caption == 'Delete' then
global.player_group[player.name] = "[Group]" for _, p in pairs(game.players) do
player.tag = "" if this.player_group[p.name] then
refresh_gui() if this.player_group[p.name] == event.element.parent.name then
return this.player_group[p.name] = '[Group]'
end p.tag = ''
end end
end end
end
game.print(player.name .. ' deleted group "' .. event.element.parent.name .. '"')
this.tag_groups[event.element.parent.name] = nil
refresh_gui()
return
end
if event.element.type == 'button' and event.element.caption == 'Leave' then
this.player_group[player.name] = '[Group]'
player.tag = ''
refresh_gui()
return
end
end
end
end end
comfy_panel_tabs["Groups"] = {gui = build_group_gui, admin = false} function Public.alphanumeric_only(value)
if value then
this.alphanumeric = value or false
end
end
comfy_panel_tabs['Groups'] = {gui = build_group_gui, admin = false}
local event = require 'utils.event' local event = require 'utils.event'
event.add(defines.events.on_gui_click, on_gui_click) event.add(defines.events.on_gui_click, on_gui_click)
event.add(defines.events.on_player_joined_game, on_player_joined_game) event.add(defines.events.on_player_joined_game, on_player_joined_game)
return Public