-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathmessage.lua
More file actions
117 lines (101 loc) · 4.39 KB
/
message.lua
File metadata and controls
117 lines (101 loc) · 4.39 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
local MiniMessage = import "net.kyori.adventure.text.minimessage.MiniMessage"
local Placeholder = import "net.kyori.adventure.text.minimessage.tag.resolver.Placeholder"
local TagResolver = import "net.kyori.adventure.text.minimessage.tag.resolver.TagResolver"
local PersistentDataType = import "org.bukkit.persistence.PersistentDataType"
local NamespacedKey = import "org.bukkit.NamespacedKey"
local canReceiveMessagesKey = NamespacedKey.new("lualinkmessages", "canreceivemessages")
local lastMessaged = {} -- Store the last person messaged for /r (using UUIDs)
local Options = {
Receive = "<gray>[From <sender>]: <reset><message>",
Send = "<gray>[To <receiver>]: <reset><message>"
}
-- Function to send a private message
local function sendPrivateMessage(sender, target, message)
-- We must put all the placeholders into a TagResolver because LuaJ won't pass all the arguments to deserialize method (it will only pass the first one and ignore the rest). This is a workaround.
local tags = TagResolver:builder():resolver(Placeholder:unparsed("sender", sender:getName())):resolver(Placeholder:unparsed("receiver", target:getName())):resolver(Placeholder:unparsed("message", message)):build()
-- Send the messages
target:sendMessage(MiniMessage:miniMessage():deserialize(
Options.Receive,
tags
))
sender:sendMessage(MiniMessage:miniMessage():deserialize(
Options.Send,
tags
))
-- Update last messaged players for both sender and target (using UUIDs)
lastMessaged[sender:getUniqueId()] = target:getUniqueId()
lastMessaged[target:getUniqueId()] = sender:getUniqueId()
end
-- Register the /msg command
script.registerSimpleCommand(function(sender, args)
if #args < 2 then
sender:sendRichMessage("<red>Usage: /msg <player> <message>")
return
end
local target = args[1]
table.remove(args, 1) -- Remove the target from the args
local message = table.concat(args, " ", 2) -- Concatenate elements from index 2 to the end
local targetPlayer = script.getServer():getPlayer(target)
if not targetPlayer then
sender:sendRichMessage("<red>Player not found or is not online: " .. target)
return
end
if not targetPlayer:getPersistentDataContainer():getOrDefault(canReceiveMessagesKey, PersistentDataType.BOOLEAN, true) then
sender:sendRichMessage("<red>Player has private messages disabled.")
return
end
sendPrivateMessage(sender, targetPlayer, message)
end, {
name = "message",
description = "Send a private message to a player",
usage = "/message <player> <message>",
aliases = {"tell", "whisper", "w", "msg"}
})
-- Register the /r command
script.registerSimpleCommand(function(sender, args)
local lastTargetUUID = lastMessaged[sender:getUniqueId()]
if not lastTargetUUID then
sender:sendRichMessage("<red>No player to reply to.")
return
end
local lastTarget = script.getServer():getPlayer(lastTargetUUID)
if not lastTarget then
sender:sendRichMessage("<red>Player not found.")
return
end
if not lastTarget:getPersistentDataContainer():getOrDefault(canReceiveMessagesKey, PersistentDataType.BOOLEAN, true) then
sender:sendRichMessage("<red>Player has private messages disabled.")
return
end
if #args < 1 then
sender:sendRichMessage("<red>Usage: /r <message>")
return
end
local message = table.concat(args, " ")
sendPrivateMessage(sender, lastTarget, message)
end, {
name = "reply",
description = "Reply to the last player messaged",
usage = "/reply <message>",
aliases = {"r"}
})
-- Register the /togglemsg command
script.registerSimpleCommand(function(sender, args)
if not utils.instanceOf(sender, "org.bukkit.entity.Player") then
sender:sendRichMessage("<red>Only players can use this command.")
return
end
local pdc = sender:getPersistentDataContainer()
local state = pdc:getOrDefault(canReceiveMessagesKey, PersistentDataType.BOOLEAN, true)
pdc:set(canReceiveMessagesKey, PersistentDataType.BOOLEAN, not state)
if not state then
sender:sendRichMessage("<green>Private messages enabled.")
else
sender:sendRichMessage("<red>Private messages disabled.")
end
end, {
name = "togglemsg",
description = "Toggle private messages",
usage = "/togglemsg <on|off>",
aliases = {"togglepm", "togglemsg"}
})