tommy-bot/src/modules/commands/minecraft.lua
tommy cec36522d1
reminder that "." is a wildcard for any and all character
patterns match using % however you escape . using a % (??? WHY)
2024-01-13 03:18:04 -05:00

114 lines
3.5 KiB
Lua

local discordia=require('discordia')
local json=require('json')
local http_request=require('./../http.lua')
local Commands=require('./../commands.lua')
discordia.extensions()
local COLOURS={
GREEN=0x00ff00,
RED=0xff0000
}
--initialize minecraft ip data
local MinecraftDataFile=io.open('minecraft_data.json','r')
if not MinecraftDataFile or (MinecraftDataFile and MinecraftDataFile:read('*a')=='') then
print('no such file exists! so make it')
io.open('minecraft_data.json','w+'):write(json.encode({})):close()
end
if MinecraftDataFile then
MinecraftDataFile:close()
end
Commands:Add('setip',{},'set ip for status',function(CommandData)
local CommandArgs=CommandData.args
local CommandMessage=CommandData.message
local ServerIPStr=CommandArgs[1]
if not ServerIPStr then
return CommandMessage:reply('No IP provided')
end
local ServerIP=ServerIPStr:match("(%d+%.%d+%.%d+%.%d+)")
if not ServerIP then
return CommandMessage:reply('Invalid server IP')
end
local ServerPort=ServerIPStr:match(ServerIP..':(%d+)') or 25565
local GuildId=CommandMessage.guild.id
if not GuildId then
return CommandMessage:reply('You cannot use this command outside of a Discord server')
end
local GuildMinecraftData={IP=ServerIP,PORT=ServerPort}
local GlobalMinecraftData=json.decode(io.open('minecraft_data.json','r'):read('*a'))
GlobalMinecraftData[GuildId]=GuildMinecraftData
io.open('minecraft_data.json','w+'):write(json.encode(GlobalMinecraftData)):close()
return CommandMessage:reply({
content='Successfully added `'..ServerIP..':'..ServerPort..'` for ServerId='..GuildId,
reference={
message=CommandMessage,
mention=true
}
})
end)
Commands:Add('status',{},'get status for minecraft server',function(CommandData)
local CommandMessage=CommandData.message
local GuildId=CommandMessage.guild.id
if not GuildId then
return CommandMessage:reply('You cannot use this command outside of a Discord server')
end
local GlobalMinecraftData=json.decode(io.open('minecraft_data.json','r'):read('*a'))
if not GlobalMinecraftData then
return CommandMessage:reply('Could not read server data')
end
local ServerMinecraftData=GlobalMinecraftData[GuildId]
if not ServerMinecraftData then
return CommandMessage:reply('There is no data for this Discord server')
end
local ServerIPStr=ServerMinecraftData.IP..':'..ServerMinecraftData.PORT
local Response,Headers=http_request('GET',('https://api.mcsrvstat.us/3/%s'):format(ServerIPStr))
local IsOnline=Response.online
local EmbedData
if IsOnline then
local MaxPlayers=Response.players.max
local OnlinePlayers=Response.players.online
local AnonymousPlayers=OnlinePlayers
local Players={}
if OnlinePlayers>0 then
for PlayerIndex,PlayerData in next,Response.players.list do
table.insert(Players,PlayerData.name)
AnonymousPlayers=AnonymousPlayers-1
end
else
table.insert(Players,'No players online')
end
if AnonymousPlayers>0 then
for AnonymousPlayerIndex=1,AnonymousPlayers do
table.insert(Players,'Anonymous Player')
end
end
EmbedData={
title='Server Status for '..ServerIPStr,
description=Response.motd.clean[1]..' ('..Response.version..')',
fields={
{name='Players',value=OnlinePlayers..'/'..MaxPlayers,inline=true},
{name='List of players',value=table.concat(Players,'\n'),inline=true}
},
color=COLOURS.GREEN
}
else
EmbedData={
title='Server Status for '..ServerIPStr,
description='Server is offline',
color=COLOURS.RED
}
end
return CommandMessage:reply({embed=EmbedData})
end)