New: Nitro Boost our Discord server and receive full donation perks here on the website! Join the Scripting Helpers Discord Server to learn more! You can also Support on Patreon as always.
Ad
Still have questions? Join our Discord server and get real time help.
Log in to vote
0

Is it possible to convert a string into a table?

Asked by
Bman8765 270 Moderation Voter
4 years ago

Okay, so I have a custom chat and when the user chats something it sends this message to the chat area. Everything works fine and how I want it to work for now but my next step is creating some sort of way to filter out rude words from even being sent. I already have spam prevention kinda but my main focus is stopping inappropriate words.

Now when I first thought to my self, how am I gonna do this bman the first idea that came to my mind is some how saving every word in the String into a table. My issue is, how would I seperate a string value into a table value when separating the spaces. Now I'll go in depth to what I mean if you are still confused, basically when the user chats something I want it to check this message before sending it. It will go through every word in this sentence a.k.a String. I want it to somehow save this String to a table word by word, so it would remove the spaces and only save the words. For example, a string value like this: "Hello my name is Bman" would then be saved to the table like this {"Hello", "my", "name", "is", "Bman"}. This way I can create a loop that scans through all the table values and if any of the table values equals one of the inappropriate words I will have defined somewhere else it will prevent the user from sending the message.

So to sum that all up, I need some sort of information about how to convert a String like this: "Hello my name is Bman" to this: local table = {"Hello", "my", "name", "is", "Bman"}

If you have any questions just ask. Wiki links ARE useful, if you found a link to somewhere describing it I would really love this, I searched all over the internet but I either missed it or could not find exactly what I was looking for!

Here is the code, it is a localscript found in a ScreenGui inside StarterGui:

repeat wait() until game.Players.LocalPlayer
wait(1)
local StarterGui = game:GetService('StarterGui')
StarterGui:SetCoreGuiEnabled(Enum.CoreGuiType.Chat, false)
---------------------------------------------------------------------------
--Variables
---------------------------------------------------------------------------
local Player = game.Players.LocalPlayer
local Mouse = Player:GetMouse()
local lastMessage
local chatBar = script.Parent.ChatBar
local cantChat = false
_G.moving = false
---------------------------------------------------------------------------
--Link to custom events
---------------------------------------------------------------------------
local playerChatted = game.ReplicatedStorage.playerChatted
---------------------------------------------------------------------------
--Remote Functions
---------------------------------------------------------------------------
local sendChatMessage = game.ReplicatedStorage.sendChatMessage
---------------------------------------------------------------------------
--Functions
---------------------------------------------------------------------------
function createCountDown(timeamt)
    repeat wait(1)
        timeamt = timeamt-1
    until timeamt == 0
end

function spamAlert()
    local normalcolor = chatBar.BackgroundColor3
    local brickcolor = BrickColor.new("Really red") --Create our new BrickColor
    local color = brickcolor.Color
    chatBar.BackgroundColor3 = color
    chatBar.Text = "Please don't repeat the same message!"
    cantChat = true
    local countdown = createCountDown(3)
    cantChat = false
    chatBar.BackgroundColor3 = normalcolor
    chatBar.Text = "Type / to chat or click this bar!"
end

function safeChatCheck(msg)
    local messageSafe
    if (lastMessage ~= nil) and (msg == lastMessage) then
        spamAlert()
        messageSafe = false
    else
        messageSafe = true
    end

    return messageSafe
end

function createChatLine()
    local textlabel = Instance.new("TextLabel")
    textlabel.BackgroundTransparency = 1
    textlabel.TextXAlignment = "Left"
    textlabel.Size = UDim2.new(1,0,.1,0)
    textlabel.Position = UDim2.new(0,0,0.76,0)
    textlabel.Name = "chatbar"
    return textlabel
end
---------------------------------------------------------------------------
--Global Functions
---------------------------------------------------------------------------
function _G.addMessage(player, chat)
    if (_G.moving == true) then
        repeat wait() until _G.moving == false
    end
    _G.moving = true
    print(_G.moving)
    for _, chatbars in pairs (script.Parent.chatFrame:GetChildren()) do
        if (chatbars.ClassName == "TextLabel") then
            chatbars:TweenPosition(UDim2.new(0,0,chatbars.Position.Y.Scale-.1,0), "Out", "Quad", .5, true)
            wait()      
        end
    end
    local chatbar = createChatLine()
    chatbar.Parent = script.Parent.chatFrame
    chatbar.Text = player.Name .. ": " .. chat
    _G.moving = false
end

---------------------------------------------------------------------------
--Events
---------------------------------------------------------------------------
Mouse.KeyDown:connect(function(Key)
    if (Key == string.char(13)) then
        if (cantChat == true) then
            return
        end
        if (script.Parent.ChatBar.Text == "Type / to chat or click this bar!") or (script.Parent.ChatBar.Text == "Please don't repeat the same message!") then
            return;
        end
        local checkMsg = safeChatCheck(script.Parent.ChatBar.Text)
        if (checkMsg == true) then
            sendChatMessage:InvokeServer(script.Parent.ChatBar.Text)
            script.Parent.ChatBar.Text = "Type / to chat or click this bar!"
        end
    end
end)

Mouse.KeyDown:connect(function(Key)
    if (cantChat == true) then
        return
    end
    if Key:lower() == "/" then
        script.Parent.ChatBar:CaptureFocus()
    end
end)
---------------------------------------------------------------------------
--Custom Events Listener
---------------------------------------------------------------------------
playerChatted.OnClientEvent:connect(function(player, msg)
    _G.addMessage(player, msg)
    lastMessage = msg
end)

1 answer

Log in to vote
2
Answered by
Goulstem 8062 Badge of Merit Moderation Voter Administrator Community Moderator
4 years ago

So, converting a string to a table using full words?

This will require string patterns. We want to use string.gmatch to detect any full words, the pattern for that would be %w+, which will get any alphanumeric group. A group ends at a whitespace(space), comma, other diget( , ^).

local str = "The fox jumped over the bridge 12 times"

function convertToTable(msg)
    local sortedMsg = {}
    for i in string.gmatch("%w+",msg) do
        table.insert(sortedMsg,i)
    end
    return sortedMsg
end

local tab = convertToTable(str)
--{'The','fox','jumped','over','the','bridge','12',times'}
print(table.concat(tab," "))
--> The fox jumped over the bridge 12 times
0
Thank you! Bman8765 270 — 4y
0
Do you know any good links to articles containing all string patterns? Bman8765 270 — 4y
1
nvm I just realized string patterns was a link, sorry :D Bman8765 270 — 4y
0
No problem, PM me if you have any further questions(: Goulstem 8062 — 4y
Ad

Answer this question