mirror of
https://github.com/FlightControl-Master/MOOSE.git
synced 2025-08-15 10:47:21 +00:00
188 lines
5.3 KiB
Lua
188 lines
5.3 KiB
Lua
--- **Utilities** - Socket.
|
|
--
|
|
-- **Main Features:**
|
|
--
|
|
-- * Creates UDP Sockets
|
|
-- * Send messages to Discord
|
|
-- * Compatible with [FunkMan](https://github.com/funkyfranky/FunkMan)
|
|
-- * Compatible with [DCSServerBot](https://github.com/Special-K-s-Flightsim-Bots/DCSServerBot)
|
|
--
|
|
-- ===
|
|
--
|
|
-- ### Author: **funkyfranky**
|
|
-- @module Utilities.Socket
|
|
-- @image MOOSE.JPG
|
|
|
|
|
|
--- SOCKET class.
|
|
-- @type SOCKET
|
|
-- @field #string ClassName Name of the class.
|
|
-- @field #number verbose Verbosity level.
|
|
-- @field #string lid Class id string for output to DCS log file.
|
|
-- @field #table socket The socket.
|
|
-- @field #number port The port.
|
|
-- @field #string host The host.
|
|
-- @field #table json JSON.
|
|
-- @extends Core.Fsm#FSM
|
|
|
|
--- **At times I feel like a socket that remembers its tooth.** -- Saul Bellow
|
|
--
|
|
-- ===
|
|
--
|
|
-- # The SOCKET Concept
|
|
--
|
|
-- Create a UDP socket server. It enables you to send messages to discord servers via discord bots.
|
|
--
|
|
-- **Note** that you have to **de-sanitize** `require` and `package` in your `MissionScripting.lua` file, which is in your `DCS/Scripts` folder.
|
|
--
|
|
--
|
|
-- @field #SOCKET
|
|
SOCKET = {
|
|
ClassName = "SOCKET",
|
|
verbose = 0,
|
|
lid = nil,
|
|
}
|
|
|
|
--- Data type. This is the keyword the socket listener uses.
|
|
-- @type SOCKET.DataType
|
|
-- @field #string TEXT Plain text.
|
|
-- @field #string BOMBRESULT Range bombing.
|
|
-- @field #string STRAFERESULT Range strafeing result.
|
|
-- @field #string LSOGRADE Airboss LSO grade.
|
|
-- @field #string TTS Text-To-Speech.
|
|
SOCKET.DataType={
|
|
TEXT="moose_text",
|
|
BOMBRESULT="moose_bomb_result",
|
|
STRAFERESULT="moose_strafe_result",
|
|
LSOGRADE="moose_lso_grade",
|
|
TTS="moose_text2speech"
|
|
}
|
|
|
|
|
|
--- SOCKET class version.
|
|
-- @field #string version
|
|
SOCKET.version="0.3.0"
|
|
|
|
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
|
-- TODO list
|
|
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
|
|
|
-- TODO: A lot!
|
|
-- TODO: Messages as spoiler.
|
|
-- TODO: Send images?
|
|
|
|
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
|
-- Constructor
|
|
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
|
|
|
--- Create a new SOCKET object.
|
|
-- @param #SOCKET self
|
|
-- @param #number Port UDP port. Default `10042`.
|
|
-- @param #string Host Host. Default `"127.0.0.1"`.
|
|
-- @return #SOCKET self
|
|
function SOCKET:New(Port, Host)
|
|
|
|
-- Inherit everything from FSM class.
|
|
local self=BASE:Inherit(self, FSM:New()) --#SOCKET
|
|
|
|
package.path = package.path..";.\\LuaSocket\\?.lua;"
|
|
package.cpath = package.cpath..";.\\LuaSocket\\?.dll;"
|
|
|
|
self.socket = require("socket")
|
|
|
|
self.port=Port or 10042
|
|
self.host=Host or "127.0.0.1"
|
|
|
|
self.json=loadfile("Scripts\\JSON.lua")()
|
|
|
|
self.UDPSendSocket=self.socket.udp()
|
|
self.UDPSendSocket:settimeout(0)
|
|
|
|
return self
|
|
end
|
|
|
|
--- Set port.
|
|
-- @param #SOCKET self
|
|
-- @param #number Port Port. Default 10042.
|
|
-- @return #SOCKET self
|
|
function SOCKET:SetPort(Port)
|
|
self.port=Port or 10042
|
|
end
|
|
|
|
--- Set host.
|
|
-- @param #SOCKET self
|
|
-- @param #string Host Host. Default `"127.0.0.1"`.
|
|
-- @return #SOCKET self
|
|
function SOCKET:SetHost(Host)
|
|
self.host=Host or "127.0.0.1"
|
|
end
|
|
|
|
|
|
--- Send a table.
|
|
-- @param #SOCKET self
|
|
-- @param #table Table Table to send.
|
|
-- @return #SOCKET self
|
|
function SOCKET:SendTable(Table)
|
|
|
|
-- Add server name for DCS
|
|
Table.server_name=BASE.ServerName or "Unknown"
|
|
|
|
-- Encode json table.
|
|
local json= self.json:encode(Table)
|
|
|
|
-- Debug info.
|
|
self:T("Json table:")
|
|
self:T(json)
|
|
|
|
-- Send data.
|
|
self.socket.try(self.UDPSendSocket:sendto(json, self.host, self.port))
|
|
|
|
return self
|
|
end
|
|
|
|
--- Send a text message.
|
|
-- @param #SOCKET self
|
|
-- @param #string Text Text message.
|
|
-- @return #SOCKET self
|
|
function SOCKET:SendText(Text)
|
|
|
|
local message={}
|
|
|
|
message.command = SOCKET.DataType.TEXT
|
|
message.text = Text
|
|
|
|
self:SendTable(message)
|
|
|
|
return self
|
|
end
|
|
|
|
--- Send a text-to-speech message.
|
|
-- @param #SOCKET self
|
|
-- @param #string Text The text message to speek.
|
|
-- @param #number Provider The TTS provider: 0=Microsoft (default), 1=Google.
|
|
-- @param #string Voice The specific voice to use, e.g. `"Microsoft David Desktop"` or "`en-US-Standard-A`". If not set, the service will choose a voice based on the other parameters such as culture and gender.
|
|
-- @param #string Culture The Culture or language code, *e.g.* `"en-US"`.
|
|
-- @param #string Gender The Gender, *i.e.* "male", "female". Default "female".
|
|
-- @param #number Volume The volume. Microsoft: [0,100] default 50, Google: [-96, 10] default 0.
|
|
-- @return #SOCKET self
|
|
function SOCKET:SendTextToSpeech(Text, Provider, Voice, Culture, Gender, Volume)
|
|
|
|
Text=Text or "Hello World!"
|
|
|
|
local message={}
|
|
|
|
message.command = SOCKET.DataType.TTS
|
|
message.text = Text
|
|
message.provider=Provider
|
|
message.voice = Voice
|
|
message.culture = Culture
|
|
message.gender = Gender
|
|
message.volume = Volume
|
|
|
|
self:SendTable(message)
|
|
|
|
return self
|
|
end
|
|
|
|
|