chatcommands.lua 8.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266
  1. minetest.register_chatcommand("minetestd", {
  2. description = "Minetest_systemd service management command. Valid actions: start, stop, restart, status. '*' can be used to operate on all services at once.",
  3. params = "<action> <service> | services [<search pattern>]",
  4. privs = {server=true},
  5. func = function(name, argstring)
  6. minetestd.minetestd_command(name, argstring) --Defined at the bottom of this file because it's f***in' huge.
  7. end,
  8. })
  9. minetest.register_chatcommand("groups", {
  10. description = "List all item groups on your held item",
  11. privs={debug=true},
  12. func = function(player_name)
  13. local player = minetest.get_player_by_name(player_name)
  14. if player then
  15. local str = ""
  16. local i=player:get_wielded_item():get_name()
  17. if not minetest.registered_items[i] then return false, "You must be holding a valid item" end
  18. if (not minetest.registered_items[i].groups) then return false, "This item has no groups" end
  19. for group, value in pairs(minetest.registered_items[i].groups) do
  20. if not (str == "") then
  21. str = str..", "
  22. end
  23. str = str..group.."="..value
  24. end
  25. if str == "" then str = "This item has no groups" end
  26. return true,str
  27. end
  28. end
  29. })
  30. minetest.register_chatcommand("getwear", {
  31. description = "Print the wear on your held item",
  32. privs={debug=true},
  33. func = function(player_name)
  34. local player = minetest.get_player_by_name(player_name)
  35. if player then
  36. return true,"Wear: "..(player:get_wielded_item():get_wear() or "nil")
  37. end
  38. end
  39. })
  40. minetest.register_chatcommand("getlight", {
  41. description = "Print useful data about the node and sky light where you're standing",
  42. func = function(player_name)
  43. local player = minetest.get_player_by_name(player_name)
  44. if player then
  45. local pos = player:get_pos()
  46. pos = vector.round(pos)
  47. local str = "Light: "
  48. if not minetest.get_node_light(pos) then
  49. return false, "Light value here is nil, for some odd reason..."
  50. end
  51. str = str..minetest.get_node_light(pos)
  52. str = str.."\nDay: "..minetest.get_node_light(pos, 0.5)..", Night: "..minetest.get_node_light(pos, 0)
  53. str = str.."\nSky (fast): "..minetestd.utils.get_sky_light_fast(pos)
  54. str = str.."\nSky (accurate): "..minetestd.utils.get_natural_light(pos)
  55. str = str.."\nArtificial: "..minetestd.utils.get_artificial_light(pos)
  56. return true,str
  57. end
  58. end
  59. })
  60. minetest.register_privilege("setphysics", {
  61. description = "Allowed to change worldwide default physics using /setgravity, /setjump, /setspeed",
  62. give_to_singleplayer = false
  63. })
  64. minetest.register_chatcommand("setgravity", {
  65. privs = {setphysics=true},
  66. func = function(_, p)
  67. local value = tonumber(p)
  68. if value then
  69. minetestd.physicsctl.worldPhysics.gravity = value
  70. return true, "World physics updated."
  71. else
  72. return false, "Expected a valid number for argument 1"
  73. end
  74. end
  75. })
  76. minetest.register_chatcommand("setspeed", {
  77. privs = {setphysics=true},
  78. func = function(_, p)
  79. local value = tonumber(p)
  80. if value then
  81. minetestd.physicsctl.worldPhysics.speed = value
  82. return true, "World physics updated."
  83. else
  84. return false, "Expected a valid number for argument 1"
  85. end
  86. end
  87. })
  88. minetest.register_chatcommand("setjump", {
  89. privs = {setphysics=true},
  90. func = function(_, p)
  91. local value = tonumber(p)
  92. if value then
  93. minetestd.physicsctl.worldPhysics.jump = value
  94. return true, "World physics updated."
  95. else
  96. return false, "Expected a valid number for argument 1"
  97. end
  98. end
  99. })
  100. minetestd.disable_service = function(servicename, playername)
  101. if minetestd.services[servicename].stop then
  102. minetestd.services[servicename].stop()
  103. else
  104. minetestd.services[servicename].enabled = false
  105. end
  106. for s,service in pairs(minetestd.services) do
  107. if service.depends[servicename] and service.enabled then
  108. minetestd.disable_service(s, playername)
  109. if playername then minetest.chat_send_player(playername, "Stopping dependant service "..s..".") end
  110. end
  111. end
  112. end
  113. minetestd.can_start = function(servicename)
  114. if not minetestd.services[servicename] then
  115. local err = "Start Failed: Service "..servicename.." does not exist."
  116. return false, err
  117. end
  118. if not minetestd.services[servicename].start then
  119. return false, "Start Failed: Service "..servicename.." does not have a start call."
  120. end
  121. if minetestd.services[servicename].enabled then
  122. local err = "Start Failed: Service "..servicename.." is already running."
  123. return false, err
  124. end
  125. if not minetestd.services[servicename].initialized then
  126. local err = "Start Failed: Service "..servicename.." did not initialize correctly, and can't be started."
  127. return false, err
  128. end
  129. for dep,_ in pairs(minetestd.services[servicename].depends) do
  130. if not minetestd.services[dep].enabled then
  131. local err = "Start Failed: Service "..servicename.." depends on "..dep..", but it is not running."
  132. return false, err
  133. end
  134. end
  135. return true
  136. end
  137. minetestd.minetestd_command = function(name, argstring)
  138. local args = ""
  139. local argc = 0
  140. if argstring ~= nil and argstring ~= "" and argstring ~= " " then
  141. args = string.split(argstring, " ")
  142. argc = #args
  143. end
  144. if argc > 0 and (args[1] == "services" or args[1] == "list" or (args[1] == "status" and args[2] == "*")) then
  145. local pattern = ""
  146. local n = 2
  147. while n <= argc do
  148. if n > 2 then
  149. pattern=pattern.." "
  150. end
  151. pattern = pattern..args[n]
  152. n = n+1
  153. end
  154. if pattern == "*" then pattern = "" end
  155. local found = minetest.colorize("#80F","Minetestd Registered Services").. minetest.colorize("#C9F"," (A=Active, I=Inactive, X=Failed):\n")
  156. local first = true
  157. for service,sv in pairs(minetestd.services) do
  158. if string.find(service, pattern) then
  159. if first then
  160. first = false
  161. else
  162. found = found..", "
  163. end
  164. found = found..service
  165. if sv.initialized then
  166. if sv.enabled then
  167. found = found.." (A)"
  168. else
  169. found = found.." (I)"
  170. end
  171. else
  172. found = found.."(X)"
  173. end
  174. end
  175. end
  176. minetest.chat_send_player(name, found)
  177. elseif argc == 2 then
  178. if minetestd.services[args[2]] or args[2] == "*" then
  179. if args[1] == "start" or args[1] == "enable" then
  180. if args[2] == "*" then
  181. for _,s in pairs(minetestd.service_load_order) do
  182. local service = minetestd.services[s]
  183. local ok, err = minetestd.can_start(s)
  184. if ok then
  185. service.start()
  186. else
  187. minetest.chat_send_player(name, err)
  188. end
  189. end
  190. elseif minetestd.services[args[2]].start then
  191. local ok, err = minetestd.can_start(args[2])
  192. if ok then
  193. minetestd.services[args[2]].start()
  194. else
  195. minetest.chat_send_player(name, err)
  196. end
  197. end
  198. elseif args[1] == "stop" or args[1] == "disable" then
  199. if args[2] == "*" then
  200. for name,service in pairs(minetestd.services) do
  201. if service.enabled then
  202. if service.stop then service.stop() end
  203. else
  204. minetest.chat_send_player(name, "Stop failed: Service "..name.." is not active.")
  205. end
  206. end
  207. else
  208. if minetestd.services[args[2]].enabled then minetestd.disable_service(args[2], name) else
  209. minetest.chat_send_player(name, "Stop failed: Service is not active.")
  210. end
  211. end
  212. elseif args[1] == "restart" or args[1] == "reload" then
  213. if args[2] == "*" then
  214. for _,s in pairs(minetestd.service_load_order) do
  215. local service = minetestd.services[s]
  216. if service.enabled and service.stop then service.stop() end
  217. local ok, err = minetestd.can_start(s)
  218. if ok then
  219. service.start()
  220. else
  221. minetest.chat_send_player(name, err)
  222. end
  223. end
  224. else
  225. if minetestd.services[args[2]].stop then minetestd.services[args[2]].stop() end
  226. local ok, err = minetestd.can_start(args[2])
  227. if ok then
  228. minetestd.services[args[2]].start()
  229. else
  230. minetest.chat_send_player(name, err)
  231. end
  232. end
  233. elseif args[1] == "status" then
  234. local status = args[2]..": "
  235. if minetestd.services[args[2]].initialized then
  236. if minetestd.services[args[2]].enabled then
  237. status = status.."active"
  238. else
  239. status = status.."idle"
  240. end
  241. else
  242. status = status.."failed to initialize"
  243. end
  244. minetest.chat_send_player(name, status)
  245. else
  246. minetest.chat_send_player(name, "Invalid arguments. See /help minetestd for usage.")
  247. end
  248. else
  249. minetest.chat_send_player(name, "That service doesn't seem to be registered.")
  250. end
  251. else
  252. minetest.chat_send_player(name, "Invalid arguments. See /help minetestd for usage.")
  253. end
  254. end