424 lines
13 KiB
Lua
424 lines
13 KiB
Lua
MY_Name="" -- Will be set at a later time
|
|
-- This is a comment
|
|
--This is the test client code!
|
|
require("Libs/Library") -- One of the defualt libraies that i load... Not needed for this project
|
|
require("Libs/Utils") -- One of the defualt libraies that i load... Not needed for this project
|
|
require("Libs/bin") -- One of the defualt libraies that i load... Not needed for this project
|
|
require("Libs/MultiManager") -- allows for multitasking
|
|
require("Libs/lovebind") -- binds my libraies to the love2d engine that i am using
|
|
require("GuiManager") -- allows the use of graphics in the program.
|
|
require("net") -- Loads the networking library
|
|
require("net.chatting")
|
|
require("net.settings") -- loads the networking settings module
|
|
require("net.identity") -- loads the networking identity module
|
|
client=net:newTCPClient("localhost",12345)
|
|
if type(client)=="boolean" then error("Please run the server file first!") end
|
|
client.OnUserLoggedIn:connect(function(self,data)
|
|
anim.Visible=false
|
|
login:Destroy()
|
|
MY_Name=data.nick
|
|
INIT()
|
|
end)
|
|
client.OnBadLogin:connect(function(self)
|
|
header.text="Login/Register (Pass/User incorrect!)"
|
|
anim.Visible=false
|
|
end)
|
|
client.OnUserAlreadyRegistered:connect(function(self,nick)
|
|
header.text="Login/Register (Username Taken!)"
|
|
anim.Visible=false
|
|
end)
|
|
client.OnUserRegistered:connect(function(self,nick)
|
|
header.text="Login/Register (Register Success!)"
|
|
anim.Visible=false
|
|
end)
|
|
client.OnNoUserWithName:connect(function(self,nick)
|
|
header.text="Login/Register (No User with that name!)"
|
|
anim.Visible=false
|
|
end)
|
|
client.OnPasswordRequest:connect(function(self)
|
|
header.text="Login/Register (Password request sent!)"
|
|
anim.Visible=false
|
|
end)
|
|
gui.ff.BorderSize=0
|
|
login=gui:newFrame("Login",0,0,0,0,0,0,1,1)
|
|
login.Color=Color.Black
|
|
header=login:newTextLabel("Login/Register",0,10,0,20,0,0,1)
|
|
header.TextColor=Color.White
|
|
header:setNewFont(20)
|
|
header.Visibility=0
|
|
username=login:newTextBox("","Username",11,52,-22,35,0,0,1)
|
|
t1=username:newTextLabel("Username",0,10,0,30,0,-1,1)
|
|
password=login:newTextBox("","Password",11,117,-22,35,0,0,1)
|
|
password.hidden=true
|
|
t2=password:newTextLabel("Password",0,10,0,30,0,-1,1)
|
|
Login=password:newTextButton("Login",0,10,100,30,0,1)
|
|
Login.Color=Color.Green
|
|
Register=Login:newTextButton("Register",10,0,100,30,1)
|
|
Register.Color=Color.Blue
|
|
nickname=login:newTextBox("","Nick",11,182,-22,35,0,0,1)
|
|
nickname.Visible=false
|
|
t3=nickname:newTextLabel("Nickname",0,10,0,30,0,-1,1)
|
|
email=login:newTextBox("","Email",11,247,-22,35,0,0,1)
|
|
email.Visible=false
|
|
t4=email:newTextLabel("Email",0,10,0,30,0,-1,1)
|
|
Back=email:newTextButton("Back",0,10,100,30,0,1)
|
|
Back.Color=Color.Red
|
|
DoRegister=Back:newTextButton("Register",10,0,100,30,1)
|
|
DoRegister.Color=Color.Blue
|
|
Login:OnReleased(function(b,self)
|
|
client:logIn(username.text,password.ttext)
|
|
anim.Visible=true
|
|
end)
|
|
Register:OnReleased(function(b,self)
|
|
Login.Visible=false
|
|
email.Visible=true
|
|
nickname.Visible=true
|
|
end)
|
|
Back:OnReleased(function(b,self)
|
|
Login.Visible=true
|
|
nickname.Visible=false
|
|
email.Visible=false
|
|
end)
|
|
DoRegister:OnReleased(function(b,self)
|
|
client:register(username.text,password.ttext,nickname.text,{email=email.text})
|
|
Login.Visible=true
|
|
nickname.Visible=false
|
|
email.Visible=false
|
|
Register.Visible=false
|
|
end)
|
|
gui.massMutate({
|
|
"setRoundness(10,10,360)",
|
|
Tween=1,
|
|
XTween=-3,
|
|
},Login,Register,Back,DoRegister)
|
|
gui.massMutate({
|
|
Visibility=0,
|
|
TextFormat="left",
|
|
TextColor=Color.White,
|
|
},t1,t2,t3,t4)
|
|
gui.massMutate({
|
|
"setRoundness(5,5,360)",
|
|
Visibility=1,
|
|
TextFormat="left",
|
|
Tween=4,
|
|
Color=Color.White,
|
|
XTween=4,
|
|
},username,password,nickname,email)
|
|
client.OnChatRecieved(function(user,msg,isself) -- hook to grab chat data
|
|
AG.holder:AddChatBubble(user,msg,isself)
|
|
end)
|
|
client.OnPrivateChatRecieved(function(user,msg,USERID) -- hook to grab chat data
|
|
print("Matching: ",app[USERID],USERID)
|
|
local lastCFrame=CFrame
|
|
if app[USERID] then
|
|
CFrame=app[USERID]
|
|
--local c=AC.holder:getChildren()
|
|
--for i=1,#c do
|
|
-- c[i].Visible=false
|
|
--end
|
|
--CFrame.Visible=true
|
|
--local c=Chatting:getChildren()
|
|
--for i=1,#c do
|
|
-- c[i].Color=Color.Yellow
|
|
--end
|
|
--CFrame.button.Color=Color.Green
|
|
end
|
|
AC:PopulateChat(user,msg)
|
|
CFrame=lastCFrame -- reset cframe after stuff has been done
|
|
end)
|
|
function love.wheelmoved(x, y) -- handle scrolling
|
|
if CFrame==nil then return end
|
|
local c=CFrame.holder:getChildren()
|
|
if y > 0 then
|
|
CFrame.holder.offset.pos.y=CFrame.holder.offset.pos.y+10
|
|
elseif y < 0 then
|
|
CFrame.holder.offset.pos.y=CFrame.holder.offset.pos.y-10
|
|
end
|
|
if CFrame.holder.offset.pos.y>0 then
|
|
CFrame.holder.offset.pos.y=0
|
|
elseif CFrame.holder.offset.pos.y<-(#c*35) then
|
|
CFrame.holder.offset.pos.y=-(#c*35)
|
|
end
|
|
end
|
|
function INIT()
|
|
love.mouse.setCursor(love.mouse.getSystemCursor("arrow"))
|
|
app=gui:newImageLabel("bg.jpg",0,0,0,0,0,0,1,1)
|
|
app.PrivateChats={}
|
|
app.PrivateChatsRef={}
|
|
app.ServerUpdate=multi:newAlarm(30)-- every 30 seconds
|
|
app.ServerUpdate:OnRing(function(alarm)
|
|
client:getUserList()
|
|
alarm:Reset()
|
|
end)
|
|
header=app:newFrame("Header",0,0,0,60,0,0,1)
|
|
header:ApplyGradient{Color.Black,Color.Lighten(Color.Black,.10)}
|
|
header.BorderSize=0
|
|
loggedInAs=header:newTextLabel("Logged in as: "..MY_Name,-250,0,250,20,1)
|
|
loggedInAs.TextColor=Color.White
|
|
loggedInAs.Tween=2
|
|
loggedInAs.Visibility=0
|
|
Options=header:newFrame("OptionHolder",0,0,0,30,0,1,1)
|
|
Options.Color=Color.Lighten(Color.Black,.10)
|
|
Options.BorderSize=0
|
|
Online=Options:newTextLabel("Online",0,0,0,0,2/3,0,1/3,1)
|
|
CChat=Options:newTextLabel("Private Chats",0,0,0,0,0,0,1/3,1)
|
|
Global=Options:newTextLabel("Global Chat",0,0,0,0,1/3,0,1/3,1)
|
|
app["Online"]=app:newFrame(0,90,0,-150,0,0,1,1)
|
|
AO=app["Online"]
|
|
--Online.Visible=false
|
|
AO.holder=AO:newFrame("Holder",0,0,0,0,0,0,1,1)
|
|
AO.holder.Visibility=0
|
|
app["Private Chats"]=app:newFrame(0,90,0,-90,0,0,1,1)
|
|
AC=app["Private Chats"]
|
|
AC.holder=AC:newFrame("Holder",0,0,0,0,.4,0,.6,1)
|
|
AC.holder.Visibility=0
|
|
AC.CurrentUSERID=""
|
|
AC.CurrentNick=""
|
|
Chatting=AC:newFrame("Chatting",0, 0, 0, 0, 0 ,0 ,.4 ,1)
|
|
Chatting.Color=Color.Lighten(Color.Black,.10)
|
|
app["Global Chat"]=app:newFrame(0,90,0,-150,0,0,1,1)
|
|
AG=app["Global Chat"]
|
|
AG.holder=AG:newFrame("Holder",0,0,0,0,0,0,1,1)
|
|
AG.holder.Visibility=0
|
|
AC.lastBubbleHeight=0
|
|
AG.holder.lastBubbleHeight=0
|
|
function AC:sendChat(msg)
|
|
--
|
|
end
|
|
function AG.holder:AddChatBubble(user,txt,USERID)
|
|
local msg=user..": "..txt
|
|
local width, wrappedtext = _defaultfont:getWrap(msg, math.floor(app.width/2)-10)
|
|
local height = _defaultfont:getHeight()
|
|
local bubble=self:newTextLabel("",0,self.lastBubbleHeight+5,math.floor(app.width/2),#wrappedtext*height+6)
|
|
bubble.TFrame=bubble:newTextLabel(msg,8,0,-16,0,0,0,1,1)
|
|
bubble.TFrame.Visibility=0
|
|
bubble.TFrame.TextFormat="left"
|
|
bubble.TFrame.Tween=-4
|
|
bubble.TFrame.TextColor=Color.White
|
|
bubble.Color=Color.White
|
|
bubble:setRoundness(5,5,360)
|
|
bubble.Visibility=.5
|
|
bubble.Color=Color.Black
|
|
if user==MY_Name then
|
|
bubble.TFrame.text=bubble.TFrame.text:gsub("("..user.."):","You:")
|
|
bubble:anchorRight(1)
|
|
end
|
|
self.lastBubbleHeight=self.lastBubbleHeight+#wrappedtext*height+11
|
|
if self.lastBubbleHeight>self.height-20 then
|
|
self.offset.pos.y=-(self.lastBubbleHeight-(self.height-20))
|
|
end
|
|
end
|
|
function AG:sendChat(msg)
|
|
client:sendChat(MY_Name,msg)
|
|
end
|
|
function AC:PopulateChat(user,msg,isself)
|
|
if CFrame.IsPChat then
|
|
local width, wrappedtext = _defaultfont:getWrap(msg, math.floor((CFrame.width)/2))
|
|
local height = _defaultfont:getHeight()
|
|
local bubble;
|
|
if #wrappedtext>1 then
|
|
bubble=CFrame:newTextLabel("",0,CFrame.lastBubbleHeight+5,0,(#wrappedtext+1)*height+6,0,0,.5)
|
|
else
|
|
bubble=CFrame:newTextLabel("",0,CFrame.lastBubbleHeight+5,0,(#wrappedtext)*height+6,0,0,.5)
|
|
end
|
|
bubble.TFrame=bubble:newTextLabel(msg,8,0,-16,0,0,0,1,1)
|
|
bubble.TFrame.Visibility=0
|
|
bubble.TFrame.TextFormat="left"
|
|
bubble.TFrame.Tween=-4
|
|
bubble.TFrame.TextColor=Color.White
|
|
bubble.Color=Color.White
|
|
bubble:setRoundness(5,5,360)
|
|
bubble.Visibility=.5
|
|
bubble.Color=Color.Black
|
|
if isself then
|
|
bubble.TFrame.text="You: "..msg
|
|
bubble:anchorRight(1)
|
|
else
|
|
bubble.TFrame.text=CFrame.Nick..": "..msg
|
|
end
|
|
print(#wrappedtext)
|
|
if #wrappedtext>1 then
|
|
CFrame.lastBubbleHeight=CFrame.lastBubbleHeight+(#wrappedtext+1)*height+11
|
|
else
|
|
CFrame.lastBubbleHeight=CFrame.lastBubbleHeight+(#wrappedtext)*height+11
|
|
end
|
|
if CFrame.lastBubbleHeight>CFrame.height-20 then
|
|
CFrame.offset.pos.y=-(CFrame.lastBubbleHeight-(self.height-20))
|
|
end
|
|
end
|
|
end
|
|
CFrame=nil
|
|
client.OnUserList(function(list)
|
|
if input.Visible then
|
|
c=0
|
|
local collections={}
|
|
local childs=AC.holder:getChildren()
|
|
for i=1,#childs do
|
|
collections[childs[i].Name]=childs[i]
|
|
end
|
|
for i,v in pairs(list) do
|
|
collections[v]=nil
|
|
if i~=MY_Name and not(AC.holder.Children[v]) then
|
|
local temp=Chatting:newTextLabel(i,0,20*(c+#Chatting:getChildren()),0,20,0,0,1)
|
|
c=c+1
|
|
temp:setRoundness(7,7,360)
|
|
temp.Color=Color.Yellow
|
|
temp.Tween=-4
|
|
temp.USERID=v
|
|
temp.link=AC.holder:newFrame(v,0,0,0,0,0,0,1,1)
|
|
temp.link.Visibility=0
|
|
app[v]=temp.link
|
|
temp.link.Visible=false
|
|
temp.link.USERID=v
|
|
temp.link.Nick=i
|
|
temp.link.holder=temp.link
|
|
temp.link.button=temp
|
|
function temp.link:sendChat(txt)
|
|
AC:PopulateChat("",txt,true)
|
|
client:sendChatTo(MY_Name,self.USERID,txt)
|
|
end
|
|
temp.link.IsPChat=true
|
|
temp.link.lastBubbleHeight=0
|
|
temp:OnReleased(function(b,self)
|
|
CFrame=self.link
|
|
local c=Chatting:getChildren()
|
|
for i=1,#c do
|
|
c[i].Color=Color.Yellow
|
|
end
|
|
temp.Color=Color.Green
|
|
local c=AC.holder:getChildren()
|
|
for i=1,#c do
|
|
c[i].Visible=false
|
|
end
|
|
self.link.Visible=true
|
|
end)
|
|
end
|
|
end
|
|
for i,v in pairs(collections) do
|
|
collections[i].button:Destroy()
|
|
collections[i]:Destroy()
|
|
AC.holder.Children[i]=nil
|
|
end
|
|
local c=Chatting:getChildren()
|
|
for i=1,#c do
|
|
c[i]:SetDualDim(0,20*(i-1),0,20,0,0,1)
|
|
end
|
|
else
|
|
anim.Visible=false
|
|
local c=AO.holder:getChildren()
|
|
for i=1,#c do
|
|
c[i]:Destroy()
|
|
end
|
|
c=0
|
|
for i,v in pairs(list) do
|
|
if i~=MY_Name then
|
|
local temp=AO.holder:newTextLabel(i,0,(c)*35,0,30,0,0,.5)
|
|
c=c+1
|
|
temp.USERID=v
|
|
temp:setRoundness(5,5,360)
|
|
temp.Color=Color.dark_gray
|
|
temp.Tween=2
|
|
temp:OnReleased(function(b,self)
|
|
table.insert(app.PrivateChats,{i,self.USERID})
|
|
end)
|
|
end
|
|
end
|
|
end
|
|
end)
|
|
function AO:Act()
|
|
CFrame=self
|
|
anim.Visible=true
|
|
input.Visible=false
|
|
client:getUserList()
|
|
end
|
|
function AC:Act()
|
|
input.Visible=true
|
|
CFrame=self
|
|
input:setDualDim(0,-60,0,60,.4,1,.6)
|
|
input:setRoundness(nil,nil,nil)
|
|
client:getUserList()
|
|
end
|
|
function AG:Act()
|
|
input.Visible=true
|
|
CFrame=self
|
|
input:setDualDim(0,-60,0,60,0,1,1)
|
|
input:setRoundness(10,10,360)
|
|
end
|
|
function app:hideOptions()
|
|
gui.massMutate({
|
|
Visible=false,
|
|
},app["Online"],app["Private Chats"],app["Global Chat"])
|
|
end
|
|
gui.massMutate({
|
|
Visibility=0,
|
|
ClipDescendants=true,
|
|
Visible=false,
|
|
},app["Online"],app["Private Chats"],app["Global Chat"])
|
|
gui.massMutate({
|
|
Tween=2,
|
|
Visibility=0,
|
|
TextColor=Color.Darken(Color.White,.3),
|
|
"setNewFont(18)",
|
|
[[OnEnter(function(self)
|
|
self.TextColor=Color.White
|
|
end)]],
|
|
[[OnExit(function(self)
|
|
self.TextColor=Color.Darken(Color.White,.3)
|
|
end)]],
|
|
[[OnReleased(function(b,self)
|
|
app:hideOptions()
|
|
app[self.text].Visible=true
|
|
app[self.text]:Act()
|
|
end)]],
|
|
},Online,CChat,Global)
|
|
textDisp=header:newTextLabel("Chats",10,15,100,30)
|
|
textDisp.TextFormat="left"
|
|
textDisp:setNewFont(28)
|
|
textDisp.TextColor=Color.White
|
|
textDisp.Visibility=0
|
|
input=app:newFrame("InputHolder",0,-60,0,60,0,1,1)
|
|
input:anchorRight(1)
|
|
input.Visibility=1
|
|
input.BorderSize=0
|
|
input:setRoundness(10,10,360)
|
|
input:ApplyGradient{Color.Black,Color.Lighten(Color.Black,.10)}
|
|
input.Visible=false
|
|
textbox=input:newTextBox("",11,14,-22,-25,0,0,1,1)
|
|
textbox:setRoundness(5,5,360)
|
|
textbox.Visibility=1
|
|
textbox.TextFormat="left"
|
|
textbox.Tween=4
|
|
textbox.Color=Color.White
|
|
textbox.XTween=4
|
|
textbox.ClipDescendants=true
|
|
input:OnUpdate(function(self)
|
|
local width, wrappedtext = _defaultfont:getWrap(textbox.text, textbox.width)
|
|
local height = _defaultfont:getHeight()
|
|
if #wrappedtext==0 then
|
|
input:SetDualDim(0,-60,0,60,0,1,1)
|
|
else
|
|
input:SetDualDim(0,-60-((#wrappedtext-1)*(height)),0,60+((height)*(#wrappedtext-1)),0,1,1)
|
|
end
|
|
end)
|
|
textbox:OnEnter(function(self,txt)
|
|
CFrame:sendChat(txt)
|
|
self.text=""
|
|
self.ttext=""
|
|
end)
|
|
AG.Visible=true
|
|
AG:Act()
|
|
end
|
|
--must be last object created!
|
|
anim=gui:newAnim("loading",.01, 0, 0, 41, 39)
|
|
anim.Visible=false
|
|
anim:OnAnimEnd(function(self)
|
|
self:Reset()
|
|
self:Resume()
|
|
end)
|
|
anim:OnUpdate(function(self)
|
|
self:centerX()
|
|
self:centerY()
|
|
end)
|
|
--~ bubble=gui:newFrame("Test",100,100,100,100)
|
|
|