135 lines
4.8 KiB
Lua
135 lines
4.8 KiB
Lua
require("net")
|
|
require("net.identity")
|
|
--General Stuff
|
|
--[[ What this module does!
|
|
Adds
|
|
net.chatting:init()
|
|
server:OnChatRecieved(function({user,msg}) end)
|
|
client:OnChatRecieved(function(user,msg) end)
|
|
client:sendChat(user,msg)
|
|
]]
|
|
net:registerModule("chatting",{3,0,0})
|
|
net.chatting.users={}
|
|
function net.chatting:getUserIdFromIP(ip)
|
|
return net.chatting.users[ip]
|
|
end
|
|
function net.chatting:init() -- calling this initilizes the library and binds it to the servers and clients created
|
|
--Server Stuff
|
|
net.OnServerCreated:connect(function(s)
|
|
print("The Chatting Module has been loaded onto the server!")
|
|
s.OnUserLoggedIn(function(user,cid,ip,port,dTable)
|
|
dTable=loadstring("return "..dTable)()
|
|
local USERID=bin.new(user):getHash(32)
|
|
net.chatting.users[USERID]={dTable.nick,cid,ip,port,dTable} -- add users that log in to the userlist
|
|
net.chatting.users[ip]=USERID -- add users that log in to the userlist
|
|
local users={}
|
|
for i,v in pairs(net.chatting.users) do
|
|
if type(i)~="userdata" then
|
|
table.insert(users,i.."|"..net.chatting.users[i][1])
|
|
end
|
|
end
|
|
table.insert(users,"")
|
|
for i,v in pairs(s.ips) do
|
|
s:send(v,"!chatting! $Users|NIL|NIL '"..table.concat(users,",").."'")
|
|
end
|
|
end)
|
|
s.OnUserLoggerOut(function(self,user)
|
|
local USERID=bin.new(user):getHash(32)
|
|
local ip=net.chatting.users[USERID]
|
|
print(USERID)
|
|
net.chatting.users[USERID]=nil
|
|
net.chatting.users[ip]=nil
|
|
end)
|
|
s.OnDataRecieved(function(self,data,cid,ip,port) -- when the server recieves data this method is triggered
|
|
--First Lets make sure we are getting chatting data
|
|
local user,msg = data:match("!chatting! (%S-) (.+)")
|
|
if user and msg then
|
|
if user:sub(1,1)=="$" then
|
|
local cmd,arg=user:match("$(.+)|(.+)")
|
|
print("Using extended chatting protocal!")
|
|
if cmd=="DM" then
|
|
local struct={ -- pack the info up as a table so the server can do filtering and whatnot to the chat
|
|
user=user,
|
|
msg=net.denormalize(msg)
|
|
}
|
|
self.OnChatRecieved:Fire(struct,"PRIVATE")
|
|
print("USERID",arg)
|
|
self:send(net.chatting.users[arg][3],"!chatting! $DM|"..net.chatting.users[arg][1].."|"..net.chatting:getUserIdFromIP(ip).." "..net.normalize(struct.msg).."",net.chatting.users[arg][4])
|
|
elseif cmd=="getUsers" then
|
|
local users={}
|
|
for i,v in pairs(net.chatting.users) do
|
|
if type(i)~="userdata" then
|
|
table.insert(users,i.."|"..net.chatting.users[i][1])
|
|
end
|
|
end
|
|
table.insert(users,"")
|
|
self:send(ip,"!chatting! $Users|NIL|NIL "..table.concat(users,",").."",port)
|
|
end
|
|
else
|
|
local struct={ -- pack the info up as a table so the server can do filtering and whatnot to the chat
|
|
user=user,
|
|
msg=net.denormalize(msg)
|
|
}
|
|
self.OnChatRecieved:Fire(struct,"GROUP") -- trigger the chat event
|
|
local USERID=net.chatting:getUserIdFromIP(ip)
|
|
for i,v in pairs(self.ips) do
|
|
if ip==v then
|
|
self:send(v,"!chatting! 1|"..struct.user.."|"..USERID.." "..net.normalize(struct.msg).."")
|
|
else
|
|
self:send(v,"!chatting! 0|"..struct.user.."|"..USERID.." "..net.normalize(struct.msg).."")
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end,"chatting")
|
|
s.rooms={}
|
|
function s:regesterRoom(roomname)
|
|
self.rooms[roomname]={}
|
|
end
|
|
s.OnChatRecieved=multi:newConnection() -- create a chat event
|
|
end)
|
|
--Client Stuff
|
|
net.OnClientCreated:connect(function(c)
|
|
c.OnDataRecieved(function(self,data) -- when the client recieves data this method is triggered
|
|
--First Lets make sure we are getting chatting data
|
|
local isself,user,USERID,msg = data:match("!chatting! (%S-)|(%S-)|(%S-) (.+)")
|
|
if not isself then return end
|
|
if tonumber(isself) then
|
|
--This is the client so our job here is done
|
|
local msg=net.denormalize(msg)
|
|
self.OnChatRecieved:Fire(user,msg,({["1"]=true, ["0"]=false})[isself],USERID) -- trigger the chat event
|
|
elseif isself:sub(1,1)=="$" then
|
|
local cmd=isself:match("$(.+)")
|
|
if cmd=="DM" then
|
|
local msg=net.denormalize(msg)
|
|
c.OnPrivateChatRecieved:Fire(user,msg,USERID)
|
|
elseif cmd=="Users" then
|
|
local tab={}
|
|
for ID,nick in msg:gmatch("(%S-)|(%S-),") do
|
|
tab[nick]=ID
|
|
end
|
|
c.OnUserList:Fire(tab)
|
|
end
|
|
end
|
|
end,"chatting")
|
|
function c:sendChat(user,msg)
|
|
self:send("!chatting! "..user.." "..net.normalize(msg).."")
|
|
end
|
|
function c:sendChatTo(user,touser,msg)
|
|
self:send("!chatting! $DM|"..touser.." "..net.normalize(msg).."")
|
|
end
|
|
function c:getUserList()
|
|
self:send("!chatting! $getUsers|NIL NIL")
|
|
end
|
|
function c:getChatFrom(userID)
|
|
self:send("!chatting! getPrivateChat|NIL "..userID) -- add if time permits
|
|
end
|
|
c.OnPrivateChatRecieved=multi:newConnection()
|
|
c.OnUserList=multi:newConnection()
|
|
c.OnChatRecieved=multi:newConnection() -- create a chat event
|
|
end)
|
|
end
|
|
if net.autoInit then
|
|
net.chatting:init()
|
|
end
|