Chat: Add string.split

This commit is contained in:
rubenwardy 2022-06-18 21:20:15 +01:00
parent 80605008c9
commit 14a356ded1
2 changed files with 77 additions and 24 deletions

View File

@ -33,6 +33,8 @@ sending messages, intercepting messages, and registering chat commands.
- [Sending Messages to Specific Players](#sending-messages-to-specific-players) - [Sending Messages to Specific Players](#sending-messages-to-specific-players)
- [Chat Commands](#chat-commands) - [Chat Commands](#chat-commands)
- [Complex Subcommands](#complex-subcommands) - [Complex Subcommands](#complex-subcommands)
- [Using string.split](#using-stringsplit)
- [Using Lua patterns](#using-lua-patterns)
- [Intercepting Messages](#intercepting-messages) - [Intercepting Messages](#intercepting-messages)
## Sending Messages to All Players ## Sending Messages to All Players
@ -88,18 +90,45 @@ message to send to the user.
## Complex Subcommands ## Complex Subcommands
It is often required to make complex chat commands, such as: It's common for chat commands to require multiple arguments, for example,
`/team join <team_name>`. There are two ways
of doing this, either using Minetest's string split or Lua patterns.
* `/msg <to> <message>`
* `/team join <teamname>`
* `/team leave <teamname>`
* `/team list`
This is usually done using [Lua patterns](https://www.lua.org/pil/20.2.html). ### Using string.split
Patterns are a way of extracting stuff from text using rules.
A string can be split up into words using `string.split(" ")`:
```lua ```lua
local to, msg = string.match(param, "^([%a%d_-]+) (*+)$") local parts = param:split(" ")
local cmd = parts[1]
if cmd == "join" then
local team_name = parts[2]
team.join(name, team_name)
return true, "Joined team!"
elseif cmd == "max_users" then
local team_name = parts[2]
local max_users = tonumber(parts[3])
if team_name and max_users then
return true, "Set max users of team " .. team_name .. " to " .. max_users
else
return false, "Usage: /team max_users <team_name> <number>`
end
else
return false, "Command needed"
end
```
### Using Lua patterns
[Lua patterns](https://www.lua.org/pil/20.2.html) are a way of extracting stuff
from text using rules. They're best suited for when there are arguments that can
contain spaces or more control is needed on how parameters are captured.
```lua
local to, msg = param:match("^([%a%d_-]+) (*+)$")
``` ```
The above code implements `/msg <to> <message>`. Let's go through left to right: The above code implements `/msg <to> <message>`. Let's go through left to right:
@ -123,13 +152,6 @@ Patterns would probably be the
[lua-users.org tutorial](http://lua-users.org/wiki/PatternsTutorial) [lua-users.org tutorial](http://lua-users.org/wiki/PatternsTutorial)
or the [PIL documentation](https://www.lua.org/pil/20.2.html). or the [PIL documentation](https://www.lua.org/pil/20.2.html).
<p class="book_hide">
There is also a library written by the author of this book which can be used
to make complex chat commands without patterns called
<a href="https://gitlab.com/rubenwardy/ChatCmdBuilder">Chat Command Builder</a>.
</p>
## Intercepting Messages ## Intercepting Messages
To intercept a message, use register_on_chat_message: To intercept a message, use register_on_chat_message:

View File

@ -30,7 +30,9 @@ Le mod possono interagire con la chat del giocatore, tra l'inviare messaggi, int
- [Inviare messaggi a giocatori specifici](#inviare-messaggi-a-giocatori-specifici) - [Inviare messaggi a giocatori specifici](#inviare-messaggi-a-giocatori-specifici)
- [Comandi](#comandi) - [Comandi](#comandi)
- [Complex Subcommands](#complex-subcommands) - [Complex Subcommands](#complex-subcommands)
- [Intercettare i messaggi](#interecettare-i-messaggi) - [Using string.split](#using-stringsplit)
- [Using Lua patterns](#using-lua-patterns)
- [Intercettare i messaggi](#intercettare-i-messaggi)
## Inviare messaggi a tutti i giocatori ## Inviare messaggi a tutti i giocatori
@ -79,17 +81,46 @@ I comandi ritornano un massimo di due valori, dove il primo è un booleano che i
{% include notice.html notice=page.cmd_online %} {% include notice.html notice=page.cmd_online %}
## Sottocomandi complessi
È spesso necessario creare dei comandi complessi, come per esempio: ## Complex Subcommands
* `/msg <a> <messaggio>` It's common for chat commands to require multiple arguments, for example,
* `/team entra <nometeam>` `/team join <team_name>`. There are two ways
* `/team esci <nometeam>` of doing this, either using Minetest's string split or Lua patterns.
* `/team elenco`
### Using string.split
A string can be split up into words using `string.split(" ")`:
```lua
local parts = param:split(" ")
local cmd = parts[1]
if cmd == "join" then
local team_name = parts[2]
team.join(name, team_name)
return true, "Joined team!"
elseif cmd == "max_users" then
local team_name = parts[2]
local max_users = tonumber(parts[3])
if team_name and max_users then
return true, "Set max users of team " .. team_name .. " to " .. max_users
else
return false, "Usage: /team max_users <team_name> <number>`
end
else
return false, "Command needed"
end
```
### Using Lua patterns
[Lua patterns](https://www.lua.org/pil/20.2.html) are a way of extracting stuff
from text using rules. They're best suited for when there are arguments that can
contain spaces or more control is needed on how parameters are captured.
Questo viene solitamente reso possibile dai [pattern di Lua](https://www.lua.org/pil/20.2.html).
I pattern sono un modo di estrapolare "cose" dal testo usando delle regole ben precise.
```lua ```lua
local a, msg = string.match(param, "^([%a%d_-]+) (*+)$") local a, msg = string.match(param, "^([%a%d_-]+) (*+)$")