Dumping current terrible implementation of a GUI for impending modularization
This commit is contained in:
parent
402aa6954f
commit
b1264d9d5a
463
GUI.py
463
GUI.py
|
@ -1,463 +0,0 @@
|
|||
import start
|
||||
import threading
|
||||
import time
|
||||
from networking import NetworkManager, PacketSenderManager
|
||||
import thread
|
||||
from threading import Lock
|
||||
try:
|
||||
import wx
|
||||
import wx.lib.scrolledpanel as scrolled
|
||||
import wx.richtext as rt
|
||||
#Eclipse pyDev error fix
|
||||
wx=wx
|
||||
except ImportError:
|
||||
pass
|
||||
|
||||
connection = None
|
||||
|
||||
class MainFrame(wx.Frame):
|
||||
|
||||
def __init__(self, *args, **kwds):
|
||||
kwds["style"] = wx.DEFAULT_FRAME_STYLE
|
||||
wx.Frame.__init__(self, *args, **kwds)
|
||||
|
||||
self.Freeze()
|
||||
self.LoginPanel = LoginFrame(self)
|
||||
self.LoginPanel.Show()
|
||||
self.ConnectPanel = ServerPanel(self)
|
||||
self.ConnectPanel.Hide()
|
||||
self.SetSize((520, 310))
|
||||
self.SetTitle("pyCraft")
|
||||
self.Thaw()
|
||||
|
||||
def setOutGoingSocket(self, socket):
|
||||
self.socket = socket
|
||||
|
||||
def showConnectionPanel(self):
|
||||
#self.LoginPanel.Destroy()
|
||||
self.LoginPanel.Hide()
|
||||
self.SetMinSize((600, 310))
|
||||
self.SetSize((600, 310))
|
||||
self.ConnectPanel.Show()
|
||||
self.Layout()
|
||||
self.ConnectPanel.Layout()
|
||||
|
||||
def showChatPanel(self):
|
||||
self.Hide()
|
||||
#self.app = wx.PySimpleApp()
|
||||
#self.ChatPanel = ServerChatPanel(None, -1, "pyCraft")
|
||||
#self.ConnectPanel.connection.setWindow(ChatPanel)
|
||||
#self.app.SetTopWindow(self.ChatPanel)
|
||||
#self.ChatPanel.Show()
|
||||
#self.app.MainLoop()
|
||||
self.Destroy()
|
||||
"""
|
||||
self.ConnectPanel.Hide()
|
||||
self.SetMinSize((600, 450))
|
||||
self.SetSize((600, 450))
|
||||
self.ChatPanel.Show()
|
||||
self.Layout()
|
||||
self.ChatPanel.Layout()
|
||||
"""
|
||||
|
||||
class LoginFrame(wx.Panel):
|
||||
|
||||
def __init__(self, parent):
|
||||
|
||||
# begin wxGlade: LoginFrame.__init__
|
||||
wx.Panel.__init__(self, parent)
|
||||
self.parent = parent
|
||||
self.LoginStaticText = wx.StaticText(self, -1, "Login")
|
||||
self.static_line_1 = wx.StaticLine(self, -1)
|
||||
self.UsernameStaticText = wx.StaticText(self, -1, "Username")
|
||||
self.UsernameEntry = wx.TextCtrl(self, -1, "", style=wx.TE_PROCESS_ENTER)
|
||||
self.PasswordStaticText = wx.StaticText(self, -1, "Password")
|
||||
self.PasswordEntry = wx.TextCtrl(self, -1, "", style=wx.TE_PASSWORD | wx.TE_PROCESS_ENTER)
|
||||
self.LoginButton = wx.Button(self, -1, "&Login")
|
||||
self.static_line_2 = wx.StaticLine(self, -1)
|
||||
self.Status = wx.StaticText(self, -1, "pyCraft, python based minecraft client by Ammar Askar")
|
||||
|
||||
self.__set_properties()
|
||||
self.__do_layout()
|
||||
|
||||
self.Bind(wx.EVT_BUTTON, self.handleLogin, self.LoginButton)
|
||||
self.UsernameEntry.Bind(wx.EVT_TEXT_ENTER, self.handleLogin)
|
||||
self.PasswordEntry.Bind(wx.EVT_TEXT_ENTER, self.handleLogin)
|
||||
self.UsernameEntry.Bind(wx.EVT_KEY_DOWN, self.onKeyDown)
|
||||
self.PasswordEntry.Bind(wx.EVT_KEY_DOWN, self.onKeyDown)
|
||||
# end wxGlade
|
||||
|
||||
def __set_properties(self):
|
||||
# begin wxGlade: LoginFrame.__set_properties
|
||||
self.parent.SetSize((520, 310))
|
||||
self.SetBackgroundColour(wx.Colour(171, 171, 171))
|
||||
self.SetFont(wx.Font(20, wx.DEFAULT, wx.NORMAL, wx.NORMAL, 0, ""))
|
||||
self.LoginStaticText.SetBackgroundColour(wx.Colour(171, 171, 171))
|
||||
self.LoginStaticText.SetFont(wx.Font(65, wx.MODERN, wx.NORMAL, wx.NORMAL, 0, "Minecraft"))
|
||||
self.UsernameStaticText.SetBackgroundColour(wx.Colour(171, 171, 171))
|
||||
self.UsernameStaticText.SetFont(wx.Font(10, wx.MODERN, wx.NORMAL, wx.NORMAL, 0, "Lucida Sans"))
|
||||
self.UsernameEntry.SetMinSize((150, 25))
|
||||
self.UsernameEntry.SetFont(wx.Font(12, wx.MODERN, wx.NORMAL, wx.NORMAL, 0, ""))
|
||||
self.PasswordStaticText.SetMinSize((87, 35))
|
||||
self.PasswordStaticText.SetBackgroundColour(wx.Colour(171, 171, 171))
|
||||
self.PasswordStaticText.SetFont(wx.Font(10, wx.MODERN, wx.NORMAL, wx.NORMAL, 0, "Lucida Sans"))
|
||||
self.PasswordEntry.SetMinSize((150, 25))
|
||||
self.PasswordEntry.SetFont(wx.Font(12, wx.MODERN, wx.NORMAL, wx.NORMAL, 0, ""))
|
||||
self.LoginButton.SetMinSize((80, 32))
|
||||
self.LoginButton.SetBackgroundColour(wx.SystemSettings_GetColour(wx.SYS_COLOUR_3DFACE))
|
||||
self.LoginButton.SetFont(wx.Font(10, wx.DEFAULT, wx.NORMAL, wx.NORMAL, 0, ""))
|
||||
self.Status.SetBackgroundColour(wx.Colour(171, 171, 171))
|
||||
self.Status.SetFont(wx.Font(8, wx.DEFAULT, wx.NORMAL, wx.NORMAL, 0))
|
||||
# end wxGlade
|
||||
|
||||
def __do_layout(self):
|
||||
# begin wxGlade: LoginFrame.__do_layout
|
||||
sizer_5 = wx.BoxSizer(wx.VERTICAL)
|
||||
sizer_8 = wx.BoxSizer(wx.HORIZONTAL)
|
||||
sizer_7 = wx.BoxSizer(wx.HORIZONTAL)
|
||||
sizer_5.Add(self.LoginStaticText, 0, wx.LEFT | wx.TOP, 5)
|
||||
sizer_5.Add((20, 19), 0, 0, 0)
|
||||
sizer_5.Add((20, 48), 0, 0, 0)
|
||||
sizer_5.Add(self.static_line_1, 0, wx.EXPAND, 0)
|
||||
sizer_7.Add(self.UsernameStaticText, 0, wx.LEFT, 5)
|
||||
sizer_7.Add(self.UsernameEntry, 0, wx.LEFT, 15)
|
||||
sizer_5.Add(sizer_7, 1, wx.EXPAND, 0)
|
||||
sizer_8.Add(self.PasswordStaticText, 0, wx.LEFT, 5)
|
||||
sizer_8.Add(self.PasswordEntry, 0, wx.LEFT, 20)
|
||||
sizer_8.Add(self.LoginButton, 0, wx.LEFT, 145)
|
||||
sizer_5.Add(sizer_8, 1, wx.EXPAND, 0)
|
||||
sizer_5.Add(self.static_line_2, 0, wx.EXPAND, 0)
|
||||
sizer_5.Add(self.Status, 0, wx.LEFT, 5)
|
||||
self.SetSizer(sizer_5)
|
||||
self.Layout()
|
||||
self.Centre()
|
||||
# end wxGlade
|
||||
|
||||
def onKeyDown(self, event):
|
||||
if(event.GetKeyCode() == 9):
|
||||
if(event.GetEventObject() == self.UsernameEntry):
|
||||
self.PasswordEntry.SetFocus()
|
||||
if(event.GetEventObject() == self.PasswordEntry):
|
||||
self.UsernameEntry.SetFocus()
|
||||
else:
|
||||
event.Skip()
|
||||
|
||||
def handlePostLogin(self, threadtokill):
|
||||
threadtokill.Kill = True
|
||||
self.Status.SetLabel("Logged in!")
|
||||
self.parent.showConnectionPanel()
|
||||
|
||||
def handleLogin(self, event):
|
||||
if(self.UsernameEntry.GetValue() == ""):
|
||||
self.Status.SetForegroundColour(wx.RED)
|
||||
self.Status.SetLabel("Enter a username")
|
||||
return
|
||||
if(self.PasswordEntry.GetValue() == ""):
|
||||
self.Status.SetForegroundColour(wx.RED)
|
||||
self.Status.SetLabel("Enter a password")
|
||||
return
|
||||
username = self.UsernameEntry.GetValue()
|
||||
password = self.PasswordEntry.GetValue()
|
||||
self.Status.SetForegroundColour(wx.BLUE)
|
||||
self.Status.SetLabel("Connecting.")
|
||||
RotationThread = ConnectingRotationThread(self)
|
||||
RotationThread.start()
|
||||
LoginThread = start.MinecraftLoginThread(self, RotationThread, username, password)
|
||||
LoginThread.start()
|
||||
|
||||
class ServerPanel(wx.Panel):
|
||||
|
||||
def __init__(self, parent):
|
||||
# begin wxGlade: ServerConnectFrame.__init__
|
||||
wx.Panel.__init__(self, parent=parent)
|
||||
|
||||
self.parent = parent
|
||||
|
||||
self.Status = wx.StaticText(self, -1, "")
|
||||
self.ServerAddressStaticText = wx.StaticText(self, -1, "Server Address")
|
||||
self.ServerAddressInput = wx.TextCtrl(self, -1, "", style=wx.TE_PROCESS_ENTER)
|
||||
self.ConnectButton = wx.Button(self, -1, "&Connect")
|
||||
self.NoGraphicsCheck = wx.CheckBox(self, -1, "")
|
||||
self.NoGraphicsStaticText = wx.StaticText(self, -1, "No Graphics (Stub until I implement graphics)")
|
||||
|
||||
self.__set_properties()
|
||||
self.__do_layout()
|
||||
|
||||
self.Bind(wx.EVT_BUTTON, self.onConnect, self.ConnectButton)
|
||||
self.Bind(wx.EVT_TEXT_ENTER, self.onConnect, self.ServerAddressInput)
|
||||
# end wxGlade
|
||||
|
||||
def __set_properties(self):
|
||||
# begin wxGlade: ServerConnectFrame.__set_properties
|
||||
self.SetSize((605, 405))
|
||||
self.SetBackgroundColour(wx.Colour(171, 171, 171))
|
||||
self.Status.SetBackgroundColour(wx.Colour(171, 171, 171))
|
||||
self.Status.SetFont(wx.Font(25, wx.MODERN, wx.NORMAL, wx.NORMAL, 0, "Minecraft"))
|
||||
self.ServerAddressStaticText.SetBackgroundColour(wx.Colour(171, 171, 171))
|
||||
self.ServerAddressStaticText.SetFont(wx.Font(12, wx.MODERN, wx.NORMAL, wx.NORMAL, 0, "Minecraft"))
|
||||
self.ServerAddressInput.SetMinSize((200, 25))
|
||||
self.ServerAddressInput.SetFont(wx.Font(11, wx.MODERN, wx.NORMAL, wx.NORMAL, 0, "Minecraft"))
|
||||
self.ConnectButton.SetMinSize((125, 25))
|
||||
self.ConnectButton.SetBackgroundColour(wx.SystemSettings_GetColour(wx.SYS_COLOUR_3DFACE))
|
||||
self.NoGraphicsCheck.SetMinSize((13, 13))
|
||||
self.NoGraphicsCheck.SetBackgroundColour(wx.Colour(171, 171, 171))
|
||||
self.NoGraphicsCheck.Enable(False)
|
||||
self.NoGraphicsCheck.SetValue(1)
|
||||
self.NoGraphicsStaticText.SetBackgroundColour(wx.Colour(171, 171, 171))
|
||||
self.NoGraphicsStaticText.SetFont(wx.Font(12, wx.DEFAULT, wx.NORMAL, wx.NORMAL, 0, ""))
|
||||
# end wxGlade
|
||||
|
||||
def __do_layout(self):
|
||||
# begin wxGlade: ServerConnectFrame.__do_layout
|
||||
self.sizer_1 = wx.BoxSizer(wx.VERTICAL)
|
||||
sizer_3 = wx.BoxSizer(wx.HORIZONTAL)
|
||||
sizer_2 = wx.BoxSizer(wx.HORIZONTAL)
|
||||
self.sizer_1.Add(self.Status, 0, wx.LEFT, 5)
|
||||
self.sizer_1.Add((20, 45), 0, 0, 0)
|
||||
sizer_2.Add(self.ServerAddressStaticText, 0, wx.LEFT, 5)
|
||||
sizer_2.Add(self.ServerAddressInput, 0, wx.LEFT, 15)
|
||||
sizer_2.Add(self.ConnectButton, 0, wx.LEFT, 15)
|
||||
self.sizer_1.Add(sizer_2, 1, 0, 0)
|
||||
sizer_3.Add(self.NoGraphicsCheck, 0, wx.LEFT | wx.TOP, 5)
|
||||
sizer_3.Add(self.NoGraphicsStaticText, 0, wx.LEFT, 10)
|
||||
self.sizer_1.Add(sizer_3, 1, wx.EXPAND, 0)
|
||||
self.SetSizer(self.sizer_1)
|
||||
# end wxGlade
|
||||
|
||||
def onConnect(self, event):
|
||||
StuffEnteredIntoBox = self.ServerAddressInput.GetValue().split(":")
|
||||
host = StuffEnteredIntoBox[0]
|
||||
if(len(StuffEnteredIntoBox) > 1):
|
||||
port = int(StuffEnteredIntoBox[1])
|
||||
else:
|
||||
port = 25565
|
||||
global connection
|
||||
connection = NetworkManager.ServerConnection(self.parent, self.parent.username, "", self.parent.sessionID, host, port)
|
||||
connection.start()
|
||||
self.Status.SetLabel("Connecting.")
|
||||
self.RotationThread = ConnectingRotationThread(self)
|
||||
self.RotationThread.start()
|
||||
|
||||
def callbackAfterConnect(self):
|
||||
self.RotationThread.Kill = True
|
||||
self.parent.showChatPanel()
|
||||
|
||||
|
||||
class ServerChatPanel(wx.Frame):
|
||||
|
||||
def __init__(self, *args, **kwds):
|
||||
self.lock = Lock()
|
||||
self.lock.acquire()
|
||||
kwds["style"] = wx.DEFAULT_FRAME_STYLE
|
||||
wx.Frame.__init__(self, *args, **kwds)
|
||||
|
||||
self.SetMinSize((600, 450))
|
||||
self.SetSize((600, 450))
|
||||
|
||||
self.Status = wx.StaticText(self, -1, "Server Chat")
|
||||
self.messageEntry = wx.TextCtrl(self, -1, "", style=wx.EXPAND|wx.TE_PROCESS_ENTER)
|
||||
self.sendButton = wx.Button(self, -1, "&Send", size=(100, wx.Button.GetDefaultSize()[1]))
|
||||
|
||||
"""
|
||||
self.ChatPanel = scrolled.ScrolledPanel(self, 1, size=(self.parent.GetSize()[0], self.parent.GetSize()[1] - 40),
|
||||
style = wx.TAB_TRAVERSAL|wx.SUNKEN_BORDER|wx.EXPAND|wx.ALL, name="ChatPanel" )
|
||||
self.ChatPanelSizer = wx.BoxSizer(wx.VERTICAL)
|
||||
"""
|
||||
|
||||
self.set_properties()
|
||||
self.do_layout()
|
||||
|
||||
self.locked = True
|
||||
|
||||
#self.Bind(wx.EVT_PAINT, self.OnPaint)
|
||||
#self.Bind(wx.EVT_ICONIZE, self.iconize)
|
||||
#self.text.Bind(wx.EVT_SCROLLWIN, self.OnScroll)
|
||||
self.sendButton.Bind(wx.EVT_BUTTON, self.sendMessage)
|
||||
self.messageEntry.Bind(wx.EVT_TEXT_ENTER, self.sendMessage)
|
||||
#self.text.Bind(wx.EVT_LEFT_DOWN, self.clickCanceller)
|
||||
|
||||
self.text.BeginFontSize(10)
|
||||
self.text.Scroll(0, self.text.GetScrollRange(wx.VERTICAL))
|
||||
global connection
|
||||
connection.setWindow(self)
|
||||
self.lock.release()
|
||||
# end wxGlade
|
||||
|
||||
def set_properties(self):
|
||||
# begin wxGlade: ServerConnectionPanel.__set_properties
|
||||
self.SetBackgroundColour(wx.Colour(171, 171, 171))
|
||||
self.Status.SetBackgroundColour(wx.Colour(171, 171, 171))
|
||||
self.Status.SetFont(wx.Font(14, wx.MODERN, wx.NORMAL, wx.BOLD, 0, "Minecraft"))
|
||||
self.messageEntry.SetFont(wx.Font(10, wx.DEFAULT, wx.NORMAL, wx.NORMAL, 0, ""))
|
||||
self.sendButton.SetMinSize((100, wx.Button.GetDefaultSize()[1]))
|
||||
self.sendButton.SetBackgroundColour(wx.SystemSettings_GetColour(wx.SYS_COLOUR_3DFACE))
|
||||
#self.ChatPanel.SetupScrolling()
|
||||
# end wxGlade
|
||||
|
||||
def do_layout(self):
|
||||
# begin wxGlade: ServerConnectionPanel.__do_layout
|
||||
#self.SetSizeHints(-1,self.GetSize().y,-1,self.GetSize().y );
|
||||
self.RootSizer = wx.BoxSizer(wx.VERTICAL)
|
||||
#sizer_4 = wx.BoxSizer(wx.VERTICAL)
|
||||
self.sizer_6 = wx.BoxSizer(wx.HORIZONTAL)
|
||||
self.RootSizer.Add(self.Status, 0, wx.LEFT, 6)
|
||||
#self.RootSizer.Add(self.ChatPanel, 1, wx.EXPAND|wx.ALL)
|
||||
self.hbox5 = wx.BoxSizer(wx.HORIZONTAL)
|
||||
self.text = rt.RichTextCtrl(self, 1, style=wx.VSCROLL|wx.EXPAND|wx.SUNKEN_BORDER|wx.ALL, size=(self.GetSize()[0] - 20, self.GetSize()[1] - 100))
|
||||
self.RootSizer.Add(self.text, 1, wx.ALL|wx.EXPAND, 3)
|
||||
self.RootSizer.Fit(self)
|
||||
self.RootSizer.Add(self.sizer_6, 0, wx.EXPAND, 0)
|
||||
self.sizer_6.Add(self.messageEntry, 1, wx.EXPAND|wx.ALL, 3)
|
||||
self.sizer_6.Add(self.sendButton, 0, wx.EXPAND|wx.ALL, 3)
|
||||
#self.RootSizer.Add(sizer_4, 1, wx.EXPAND, 0)
|
||||
self.SetSizer(self.RootSizer)
|
||||
self.RootSizer.Fit(self)
|
||||
self.Layout()
|
||||
# end wxGlade
|
||||
|
||||
def clickCanceller(self, event):
|
||||
pass
|
||||
|
||||
def OnScroll(self, event):
|
||||
event.Skip()
|
||||
if(self.text.GetScrollRange(wx.VERTICAL) - self.text.GetScrollPos(wx.VERTICAL) == 81):
|
||||
self.locked = True
|
||||
else:
|
||||
self.locked = False
|
||||
|
||||
def OnPaint(self, event):
|
||||
self.text.SetSize((self.GetSize()[0] - 20, self.GetSize()[1] - 100))
|
||||
if(self.locked):
|
||||
self.text.Scroll(0, self.text.GetScrollRange(wx.VERTICAL))
|
||||
wx.PaintDC(self)
|
||||
|
||||
def iconize(self, event):
|
||||
self.text.SetSize((self.GetSize()[0] - 20, self.GetSize()[1] - 100))
|
||||
if(self.locked):
|
||||
self.text.Scroll(0, self.text.GetScrollRange(wx.VERTICAL))
|
||||
|
||||
def sendMessage(self, event):
|
||||
if(self.messageEntry.GetValue() == ""):
|
||||
self.Status.SetLabel("No message entered QQ")
|
||||
return False
|
||||
thread.start_new_thread(PacketSenderManager.send03, (connection.grabSocket(), self.messageEntry.GetValue()))
|
||||
self.messageEntry.SetValue("")
|
||||
|
||||
|
||||
def handleChat(self, message):
|
||||
self.lock.acquire()
|
||||
self.text.BeginFontSize(10)
|
||||
"""
|
||||
if(u'\xa7' not in message):
|
||||
self.text.WriteText(message)
|
||||
self.text.Newline()
|
||||
self.text.BeginTextColour('#000000')
|
||||
self.lock.release()
|
||||
return
|
||||
"""
|
||||
message2 = message
|
||||
message2 = message2.split(u'\xa7')
|
||||
first = True
|
||||
for part in message2:
|
||||
if(first == True):
|
||||
first = False
|
||||
self.text.WriteText(part)
|
||||
continue
|
||||
if(part.__len__() == 0):
|
||||
continue
|
||||
if(message2.__len__() == 1):
|
||||
self.text.WriteText(message)
|
||||
continue
|
||||
colourcode = part[0]
|
||||
stringpart = part[1:]
|
||||
if(colourcode == "0"):
|
||||
self.text.BeginTextColour('#e3dde1')
|
||||
elif(colourcode == "1"):
|
||||
self.text.BeginTextColour('#0000aa')
|
||||
elif(colourcode == "2"):
|
||||
self.text.BeginTextColour('#00aa00')
|
||||
elif(colourcode == "3"):
|
||||
self.text.BeginTextColour('#00aaaa')
|
||||
elif(colourcode == "4"):
|
||||
self.text.BeginTextColour('#aa0000')
|
||||
elif(colourcode == "5"):
|
||||
self.text.BeginTextColour('#aa00aa')
|
||||
elif(colourcode == "6"):
|
||||
self.text.BeginTextColour('#ffaa00')
|
||||
elif(colourcode == "7"):
|
||||
self.text.BeginTextColour('#aaaaaa')
|
||||
elif(colourcode == "8"):
|
||||
self.text.BeginTextColour('#555555')
|
||||
elif(colourcode == "9"):
|
||||
self.text.BeginTextColour('#5555ff')
|
||||
elif(colourcode == "a"):
|
||||
self.text.BeginTextColour('#55ff55')
|
||||
elif(colourcode == "b"):
|
||||
self.text.BeginTextColour('#55ffff')
|
||||
elif(colourcode == "c"):
|
||||
self.text.BeginTextColour('#ff5555')
|
||||
elif(colourcode == "d"):
|
||||
self.text.BeginTextColour('#ff55ff')
|
||||
elif(colourcode == "e"):
|
||||
self.text.BeginTextColour('#E6E222')
|
||||
elif(colourcode == "f"):
|
||||
self.text.BeginTextColour('#000000')
|
||||
elif(colourcode == "k"):
|
||||
self.text.BeginUnderline()
|
||||
elif(colourcode == "l"):
|
||||
self.text.BeginBold()
|
||||
elif(colourcode == "m"):
|
||||
self.text.BeginUnderline()
|
||||
elif(colourcode == "n"):
|
||||
self.text.BeginUnderline()
|
||||
elif(colourcode == "o"):
|
||||
self.text.BeginItalic()
|
||||
elif(colourcode == "r"):
|
||||
self.text.EndItalic()
|
||||
self.text.EndUnderline()
|
||||
self.text.EndBold()
|
||||
"""
|
||||
else:
|
||||
self.text.WriteText(u'\xa7')
|
||||
self.text.WriteText(colourcode)
|
||||
"""
|
||||
self.text.WriteText(stringpart)
|
||||
self.text.EndItalic()
|
||||
self.text.EndUnderline()
|
||||
self.text.EndBold()
|
||||
self.text.BeginTextColour('#000000')
|
||||
#if(self.locked):
|
||||
self.text.Scroll(0, self.text.GetScrollRange(wx.VERTICAL))
|
||||
self.text.Newline()
|
||||
self.lock.release()
|
||||
|
||||
# end of class wxScrolledPanel
|
||||
|
||||
class ConnectingRotationThread(threading.Thread):
|
||||
|
||||
def __init__(self, window):
|
||||
threading.Thread.__init__(self)
|
||||
self.window = window
|
||||
self.Kill = False
|
||||
|
||||
def run(self):
|
||||
i = 1
|
||||
while True:
|
||||
if(self.Kill == True):
|
||||
break
|
||||
if(i == 0 and self.window):
|
||||
self.window.Status.SetLabel("Connecting.")
|
||||
elif(i == 1 and self.window):
|
||||
self.window.Status.SetLabel("Connecting..")
|
||||
elif(i == 2 and self.window):
|
||||
self.window.Status.SetLabel("Connecting...")
|
||||
elif(i == 3 and self.window):
|
||||
self.window.Status.SetLabel("Connecting....")
|
||||
elif(i == 4 and self.window):
|
||||
self.window.Status.SetLabel("Connecting.....")
|
||||
i = -1
|
||||
elif(self.window == None):
|
||||
self.Kill = True
|
||||
i = i + 1
|
||||
time.sleep(1)
|
||||
|
|
@ -1,25 +0,0 @@
|
|||
import urllib2, urllib
|
||||
|
||||
def loginToMinecraft(username, password):
|
||||
try:
|
||||
url = 'https://login.minecraft.net'
|
||||
header = {'Content-Type' : 'application/x-www-form-urlencoded'}
|
||||
data = {'user' : username,
|
||||
'password' : password,
|
||||
'version' : '13'}
|
||||
data = urllib.urlencode(data)
|
||||
req = urllib2.Request(url, data, header)
|
||||
opener = urllib2.build_opener()
|
||||
response = opener.open(req, None, 10)
|
||||
response = response.read()
|
||||
except urllib2.URLError:
|
||||
return {'Response' : "Can't connect to minecraft.net"}
|
||||
if(not "deprecated" in response.lower()):
|
||||
return {'Response' : response}
|
||||
response = response.split(":")
|
||||
sessionid = response[3]
|
||||
toReturn = {'Response' : "Good to go!",
|
||||
'Username' : response[2],
|
||||
'SessionID' : sessionid
|
||||
}
|
||||
return toReturn
|
43
Utils.py
43
Utils.py
|
@ -1,4 +1,7 @@
|
|||
import re
|
||||
import urllib2
|
||||
import urllib
|
||||
import threading
|
||||
from hashlib import sha1
|
||||
|
||||
# This function courtesy of barneygale
|
||||
|
@ -39,4 +42,42 @@ def translate_escape(m):
|
|||
return ""
|
||||
|
||||
def translate_escapes(s):
|
||||
return re.sub(ur"\xa7([0-9a-zA-Z])", translate_escape, s) + "\x1b[0m"
|
||||
return re.sub(ur"\xa7([0-9a-zA-Z])", translate_escape, s) + "\x1b[0m"
|
||||
|
||||
def loginToMinecraft(username, password):
|
||||
try:
|
||||
url = 'https://login.minecraft.net'
|
||||
header = {'Content-Type' : 'application/x-www-form-urlencoded'}
|
||||
data = {'user' : username,
|
||||
'password' : password,
|
||||
'version' : '13'}
|
||||
data = urllib.urlencode(data)
|
||||
req = urllib2.Request(url, data, header)
|
||||
opener = urllib2.build_opener()
|
||||
response = opener.open(req, None, 10)
|
||||
response = response.read()
|
||||
except urllib2.URLError:
|
||||
return {'Response' : "Can't connect to minecraft.net"}
|
||||
if(not "deprecated" in response.lower()):
|
||||
return {'Response' : response}
|
||||
response = response.split(":")
|
||||
sessionid = response[3]
|
||||
toReturn = {'Response' : "Good to go!",
|
||||
'Username' : response[2],
|
||||
'SessionID' : sessionid
|
||||
}
|
||||
return toReturn
|
||||
|
||||
class MinecraftLoginThread(threading.Thread):
|
||||
|
||||
def __init__(self, username, password):
|
||||
threading.Thread.__init__(self)
|
||||
self.username = username
|
||||
self.password = password
|
||||
|
||||
def run(self):
|
||||
self.response = loginToMinecraft(self.username, self.password)
|
||||
|
||||
def getResponse(self):
|
||||
return self.response
|
||||
|
|
@ -1,4 +1,5 @@
|
|||
import struct
|
||||
import types
|
||||
|
||||
def readBoolean(FileObject):
|
||||
return struct.unpack('?', FileObject.read(1))[0]
|
||||
|
@ -34,6 +35,41 @@ def readString(FileObject):
|
|||
length = readShort(FileObject) * 2
|
||||
return FileObject.read(length).decode("utf-16be")
|
||||
|
||||
def sendBoolean(socket, value):
|
||||
assert type(value) is types.BooleanType, "value is not a boolean: %r" % value
|
||||
socket.send(struct.pack('?', value))
|
||||
|
||||
def sendByte(socket, value):
|
||||
socket.send(struct.pack('!b', value))
|
||||
|
||||
def sendUnsignedByte(socket, value):
|
||||
socket.send(struct.pack('!B', value))
|
||||
|
||||
def sendShort(socket, value):
|
||||
socket.send(struct.pack('!h', value))
|
||||
|
||||
def sendUnsignedShort(socket, value):
|
||||
socket.send(struct.pack('!H', value))
|
||||
|
||||
def sendInt(socket, value):
|
||||
assert type(value) is types.IntType, "value is not an integer: %r" % value
|
||||
socket.send(struct.pack('!i', value))
|
||||
|
||||
def sendFloat(socket, value):
|
||||
socket.send(struct.pack('!f', value))
|
||||
|
||||
def sendLong(socket, value):
|
||||
socket.send(struct.pack('!q', value))
|
||||
|
||||
def sendDouble(socket, value):
|
||||
socket.send(struct.pack('!d'), value)
|
||||
|
||||
def sendString(socket, value):
|
||||
if (type(value) is not types.StringType):
|
||||
value = str(value)
|
||||
socket.send(struct.pack('!h', value.__len__()))
|
||||
socket.send(value.encode('utf-16be'))
|
||||
|
||||
def readEntityMetadata(FileObject):
|
||||
metadata = {}
|
||||
byte = struct.unpack('!B', FileObject.read(1))[0]
|
||||
|
|
|
@ -39,8 +39,8 @@ class ServerConnection(threading.Thread):
|
|||
self.NoGUI = False
|
||||
self.window = window
|
||||
|
||||
def disconnect(self):
|
||||
PacketSenderManager.sendFF(self.socket, "Disconnected by user")
|
||||
def disconnect(self, reason="Disconnected by user"):
|
||||
PacketSenderManager.sendFF(self.socket, reason)
|
||||
self.listener.kill = True
|
||||
self.socket.close()
|
||||
|
||||
|
@ -64,13 +64,7 @@ class ServerConnection(threading.Thread):
|
|||
packetid = self.socket.recv(1)
|
||||
|
||||
#Sanity check the packet id
|
||||
if (packetid != "\xFD"):
|
||||
if(self.NoGUI == False):
|
||||
self.window.ConnectPanel.Status.SetFont(wx.Font(15, wx.MODERN, wx.NORMAL, wx.NORMAL, 0, "Minecraft"))
|
||||
self.window.ConnectPanel.Status.SetLabel("Server responded with malformed packet")
|
||||
else:
|
||||
print "Server responded with malformed packet"
|
||||
return False
|
||||
assert packetid == "\xFD", "Server didn't respond back to handshake with proper packet!"
|
||||
|
||||
#Parse the packet
|
||||
packetFD = PacketListenerManager.handleFD(self.FileObject)
|
||||
|
@ -118,35 +112,17 @@ class ServerConnection(threading.Thread):
|
|||
|
||||
#Send out a a packet FC to the server
|
||||
PacketSenderManager.sendFC(self.socket, encryptedSharedSecret, encryptedSanityToken)
|
||||
|
||||
#GUI handling
|
||||
if(self.NoGUI == False):
|
||||
self.window.ConnectPanel.callbackAfterConnect()
|
||||
#Wait for server screen to be ready
|
||||
while(not hasattr(self.window, 'text')):
|
||||
continue
|
||||
|
||||
except Exception, e:
|
||||
#handle gui errors
|
||||
if(self.NoGUI == False and hasattr(self.window, 'ConnectPanel')):
|
||||
self.window.ConnectPanel.Status.SetForegroundColour(wx.RED)
|
||||
self.window.ConnectPanel.Status.SetLabel("Conection to sessions.mc.net failed")
|
||||
self.window.ConnectPanel.RotationThread.Kill = True
|
||||
traceback.print_exc()
|
||||
else:
|
||||
if(self.NoGUI):
|
||||
print "Server is in offline mode"
|
||||
print "Server is in offline mode"
|
||||
#TODO: handle offline mod servers
|
||||
except Exception, e:
|
||||
if(self.NoGUI == False and self.window):
|
||||
self.window.ConnectPanel.Status.SetForegroundColour(wx.RED)
|
||||
self.window.ConnectPanel.Status.SetLabel("Connection to server failed")
|
||||
self.window.ConnectPanel.RotationThread.Kill = True
|
||||
else:
|
||||
print "Connection to server failed"
|
||||
print "Connection to server failed"
|
||||
traceback.print_exc()
|
||||
sys.exit(1)
|
||||
return False
|
||||
#self.window.Status.SetLabel("Connected to " + self.server + "!")
|
||||
|
||||
class EncryptedFileObjectHandler():
|
||||
|
||||
|
@ -224,14 +200,11 @@ class PacketListener(threading.Thread):
|
|||
print "Logged in \o/ Received an entity id of " + str(packet['EntityID'])
|
||||
elif(response == "\x03"):
|
||||
packet = PacketListenerManager.handle03(self.FileObject)
|
||||
if(self.connection.NoGUI):
|
||||
# Add "\x1b" because it is essential for ANSI escapes emitted by translate_escapes
|
||||
filtered_string = filter(lambda x: x in string.printable + "\x1b", Utils.translate_escapes(packet))
|
||||
#print message.replace(u'\xa7', '&')
|
||||
print filtered_string
|
||||
packet = {'Message' : filtered_string}
|
||||
elif(self.window):
|
||||
self.window.handleChat(packet)
|
||||
# Add "\x1b" because it is essential for ANSI escapes emitted by translate_escapes
|
||||
filtered_string = filter(lambda x: x in string.printable + "\x1b", Utils.translate_escapes(packet['Message']))
|
||||
#print message.replace(u'\xa7', '&')
|
||||
print filtered_string
|
||||
packet['Message'] = filter(lambda x: x in string.printable, packet['Message'])
|
||||
elif(response == "\x04"):
|
||||
packet = PacketListenerManager.handle04(self.FileObject)
|
||||
elif(response == "\x05"):
|
||||
|
@ -294,7 +267,7 @@ class PacketListener(threading.Thread):
|
|||
packet = PacketListenerManager.handle2B(self.FileObject)
|
||||
elif(response == "\x33"):
|
||||
PacketListenerManager.handle33(self.FileObject)
|
||||
packet = {'PlaceHolder' : 0}
|
||||
packet = {'ChunkPlaceHolder' : 0}
|
||||
elif(response == "\x34"):
|
||||
packet = PacketListenerManager.handle34(self.FileObject)
|
||||
elif(response == "\x35"):
|
||||
|
@ -305,7 +278,7 @@ class PacketListener(threading.Thread):
|
|||
packet = PacketListenerManager.handle37(self.FileObject)
|
||||
elif(response == "\x38"):
|
||||
PacketListenerManager.handle38(self.FileObject)
|
||||
packet = {'PlaceHolder' : 0}
|
||||
packet = {'ChunkPlaceHolder' : 0}
|
||||
elif(response == "\x3C"):
|
||||
packet = PacketListenerManager.handle3C(self.FileObject)
|
||||
elif(response == "\x3D"):
|
||||
|
@ -353,25 +326,19 @@ class PacketListener(threading.Thread):
|
|||
self.connection.isConnected = True
|
||||
PacketSenderManager.sendCD(self.socket, 0)
|
||||
elif(response == "\xFF"):
|
||||
DisconMessage = PacketListenerManager.handleFF(self.FileObject)
|
||||
if(self.window == None):
|
||||
print "Disconnected: " + DisconMessage
|
||||
sys.exit()
|
||||
if(self.window):
|
||||
if(hasattr(self.window, 'ChatPanel')):
|
||||
self.window.ChatPanel.Status.SetLabel("Disconnected: " + DisconMessage)
|
||||
if(hasattr(self.window, 'Status')):
|
||||
self.window.Status.SetLabel("Disconnected: " + DisconMessage)
|
||||
self.socket.close()
|
||||
packet = PacketListenerManager.handleFF(self.FileObject)
|
||||
print "Disconnected: " + packet['Reason']
|
||||
if(f != None):
|
||||
f.close()
|
||||
self.connection.disconnect()
|
||||
sys.exit(1)
|
||||
break
|
||||
else:
|
||||
if(self.window == None):
|
||||
print "Protocol error: " + hex(ord(response))
|
||||
self.socket.close()
|
||||
if(f != None):
|
||||
f.close()
|
||||
sys.exit(1)
|
||||
break
|
||||
print "Protocol error: " + hex(ord(response))
|
||||
self.connection.disconnect("Protocol error, invalid packet: " + hex(ord(response)))
|
||||
if(f != None):
|
||||
f.close()
|
||||
sys.exit(1)
|
||||
break
|
||||
if(self.connection.options != None and self.connection.options.dumpPackets):
|
||||
f.write(hex(ord(response)) + " : " + str(packet) + '\n')
|
||||
|
|
|
@ -27,7 +27,7 @@ def handle02(FileObject):
|
|||
|
||||
def handle03(FileObject):
|
||||
message = DataUtil.readString(FileObject)
|
||||
return message
|
||||
return {'Message' : message }
|
||||
|
||||
def handle04(FileObject):
|
||||
time = DataUtil.readLong(FileObject)
|
||||
|
@ -745,4 +745,4 @@ def handleFD(FileObject):
|
|||
|
||||
def handleFF(FileObject):
|
||||
Reason = DataUtil.readString(FileObject)
|
||||
return Reason
|
||||
return {'Reason' : Reason}
|
||||
|
|
|
@ -1,58 +1,54 @@
|
|||
import socket
|
||||
import struct
|
||||
import DataUtil
|
||||
|
||||
def send00(socket, KAid):
|
||||
#packet id
|
||||
socket.send("\x00")
|
||||
|
||||
#int - keep alive id
|
||||
socket.send(struct.pack('!i', KAid))
|
||||
DataUtil.sendInt(socket, KAid)
|
||||
|
||||
def sendHandshake(socket, username, host, port):
|
||||
#packet id
|
||||
socket.send("\x02")
|
||||
|
||||
#byte - protocol version
|
||||
socket.send(struct.pack('!b', 47))
|
||||
DataUtil.sendByte(socket, 47)
|
||||
|
||||
#string - username
|
||||
socket.send(struct.pack('!h', username.__len__()))
|
||||
socket.send(username.encode('utf-16be'))
|
||||
DataUtil.sendString(socket, username)
|
||||
|
||||
#string - server host
|
||||
socket.send(struct.pack('!h', host.__len__()))
|
||||
socket.send(host.encode('utf-16be'))
|
||||
DataUtil.sendString(socket, host)
|
||||
|
||||
#int - server port
|
||||
socket.send(struct.pack('!i', port))
|
||||
DataUtil.sendInt(socket, port)
|
||||
|
||||
def send03(socket, message):
|
||||
#packet id
|
||||
socket.send("\x03")
|
||||
|
||||
#-----string - message-----#
|
||||
socket.send(struct.pack('!h', message.__len__())) #length
|
||||
socket.send(message.encode("utf-16be")) #message
|
||||
DataUtil.sendString(socket, message)
|
||||
|
||||
def sendCD(socket, payload):
|
||||
#packet id
|
||||
socket.send("\xCD")
|
||||
|
||||
#payload - byte
|
||||
socket.send(struct.pack('!b', payload))
|
||||
DataUtil.sendByte(socket, payload)
|
||||
|
||||
def sendFC(socket, secret, token):
|
||||
#packet id
|
||||
socket.send("\xFC")
|
||||
|
||||
#shared secret
|
||||
socket.send(struct.pack('!h', secret.__len__())) #length
|
||||
DataUtil.sendShort(socket, secret.__len__()) #length
|
||||
socket.send(secret)
|
||||
|
||||
#token
|
||||
socket.send(struct.pack('!h', token.__len__())) #length
|
||||
DataUtil.sendShort(socket, token.__len__())
|
||||
socket.send(token)
|
||||
|
||||
def sendFF(socket, reason):
|
||||
socket.send(struct.pack('!h', reason.__len__())) #length
|
||||
socket.send(reason.encode("utf-16be")) #message
|
||||
#string - disconnect reason
|
||||
DataUtil.sendString(socket, reason)
|
186
start.py
186
start.py
|
@ -1,110 +1,13 @@
|
|||
import urllib
|
||||
import urllib2
|
||||
import getpass
|
||||
import sys
|
||||
import NoGUIstuff
|
||||
import time
|
||||
import threading
|
||||
import Utils
|
||||
from networking import PacketSenderManager, NetworkManager
|
||||
from optparse import OptionParser
|
||||
wxImportError = False
|
||||
try:
|
||||
import wx
|
||||
import GUI
|
||||
wx = wx
|
||||
except ImportError:
|
||||
print "wxPython not found, falling back to no gui version"
|
||||
wxImportError = True
|
||||
|
||||
class MinecraftLoginThread(threading.Thread):
|
||||
|
||||
def __init__(self, window, rotationthread, username, password):
|
||||
threading.Thread.__init__(self)
|
||||
self.username = username
|
||||
self.password = password
|
||||
self.window = window
|
||||
self.rotationthread = rotationthread
|
||||
|
||||
def run(self):
|
||||
url = 'https://login.minecraft.net'
|
||||
header = {'Content-Type' : 'application/x-www-form-urlencoded'}
|
||||
data = {'user' : self.username,
|
||||
'password' : self.password,
|
||||
'version' : '13'}
|
||||
try:
|
||||
data = urllib.urlencode(data)
|
||||
req = urllib2.Request(url, data, header)
|
||||
opener = urllib2.build_opener()
|
||||
response = opener.open(req)
|
||||
response = response.read()
|
||||
except urllib2.URLError:
|
||||
self.rotationthread.Kill = True
|
||||
self.window.Status.SetForegroundColour(wx.RED)
|
||||
self.window.Status.SetLabel('Connection to minecraft.net failed')
|
||||
return
|
||||
if(response == "Bad login"):
|
||||
self.rotationthread.Kill = True
|
||||
self.window.Status.SetForegroundColour(wx.RED)
|
||||
self.window.Status.SetLabel('Incorrect username or password')
|
||||
return
|
||||
if(response == "Account migrated, use e-mail as username."):
|
||||
self.rotationthread.Kill = True
|
||||
self.window.Status.SetForegroundColour(wx.RED)
|
||||
self.window.Status.SetLabel('Account migrated, use e-mail as username.')
|
||||
response = response.split(":")
|
||||
username = response[2]
|
||||
sessionID = response[3]
|
||||
#KeepConnectionAlive(self.username, self.password, self.window).start()
|
||||
self.window.parent.username = username
|
||||
self.window.parent.sessionID = sessionID
|
||||
self.window.loggedIn = True
|
||||
self.window.handlePostLogin(self.rotationthread)
|
||||
|
||||
class KeepConnectionAlive(threading.Thread):
|
||||
|
||||
def __init__(self, username, password, window):
|
||||
threading.Thread.__init__(self)
|
||||
self.username = username
|
||||
self.password = password
|
||||
self.window = window
|
||||
|
||||
def run(self):
|
||||
while True:
|
||||
time.sleep(300)
|
||||
url = 'https://login.minecraft.net'
|
||||
header = {'Content-Type' : 'application/x-www-form-urlencoded'}
|
||||
data = {'user' : self.username,
|
||||
'password' : self.password,
|
||||
'version' : '13'}
|
||||
try:
|
||||
data = urllib.urlencode(data)
|
||||
req = urllib2.Request(url, data, header)
|
||||
opener = urllib2.build_opener()
|
||||
response = opener.open(req)
|
||||
response = response.read()
|
||||
except urllib2.URLError:
|
||||
popup = wx.MessageBox('Keep alive to minecraft.net failed', 'Warning',
|
||||
wx.OK | wx.ICON_ERROR)
|
||||
popup.ShowModal()
|
||||
if(response == "Bad login"):
|
||||
popup = wx.MessageBox('Keep alive to minecraft.net failed (Incorrect username/password)', 'Warning',
|
||||
wx.OK | wx.ICON_ERROR)
|
||||
popup.ShowModal()
|
||||
return
|
||||
response = response.split(":")
|
||||
sessionID = response[3]
|
||||
if(self.window != None):
|
||||
self.window.parent.sessionID = sessionID
|
||||
self.window.parent.loggedIn = True
|
||||
|
||||
if __name__ == "__main__":
|
||||
|
||||
parser = OptionParser()
|
||||
|
||||
parser.add_option("-n", "--nogui",
|
||||
action="store_true", dest="noGUI", default=False,
|
||||
help="don't use a GUI")
|
||||
|
||||
parser.add_option("-u", "--username", dest="username", default="",
|
||||
help="username to log in with (only with no gui mode)")
|
||||
|
||||
|
@ -123,52 +26,43 @@ if __name__ == "__main__":
|
|||
|
||||
(options, args) = parser.parse_args()
|
||||
|
||||
if(options.noGUI or wxImportError):
|
||||
if(options.username != ""):
|
||||
user = options.username
|
||||
else:
|
||||
user = raw_input("Enter your username: ")
|
||||
if(options.password != ""):
|
||||
passwd = options.password
|
||||
else:
|
||||
passwd = getpass.getpass("Enter your password: ")
|
||||
derp = NoGUIstuff.loginToMinecraft(user, passwd)
|
||||
if(derp['Response'] != "Good to go!"):
|
||||
print derp['Response']
|
||||
sys.exit()
|
||||
sessionid = derp['SessionID']
|
||||
print "Logged in as " + derp['Username'] + "! Your session id is: " + sessionid
|
||||
if(options.server != ""):
|
||||
stuff = options.server
|
||||
else:
|
||||
stuff = raw_input("Enter host and port if any: ")
|
||||
if ':' in stuff:
|
||||
StuffEnteredIntoBox = stuff.split(":")
|
||||
host = StuffEnteredIntoBox[0]
|
||||
port = int(StuffEnteredIntoBox[1])
|
||||
else:
|
||||
host = stuff
|
||||
port = 25565
|
||||
connection = NetworkManager.ServerConnection(None, derp['Username'], passwd, sessionid, host, port, options)
|
||||
connection.start()
|
||||
while True:
|
||||
try:
|
||||
chat_input = raw_input()
|
||||
if (connection.isConnected):
|
||||
PacketSenderManager.send03(connection.grabSocket(), chat_input)
|
||||
else:
|
||||
pass
|
||||
except KeyboardInterrupt, e:
|
||||
connection.disconnect()
|
||||
sys.exit(1)
|
||||
if(options.username != ""):
|
||||
user = options.username
|
||||
else:
|
||||
app = wx.PySimpleApp()
|
||||
Login = GUI.MainFrame(None, -1, "")
|
||||
app.SetTopWindow(Login)
|
||||
Login.Show()
|
||||
app.MainLoop()
|
||||
app2 = wx.PySimpleApp()
|
||||
ChatPanel = GUI.ServerChatPanel(None, -1, "pyCraft")
|
||||
app2.SetTopWindow(ChatPanel)
|
||||
ChatPanel.Show()
|
||||
app2.MainLoop()
|
||||
user = raw_input("Enter your username: ")
|
||||
if(options.password != ""):
|
||||
passwd = options.password
|
||||
else:
|
||||
passwd = getpass.getpass("Enter your password: ")
|
||||
loginThread = Utils.MinecraftLoginThread(user, passwd)
|
||||
loginThread.start()
|
||||
loginThread.join()
|
||||
derp = loginThread.getResponse()
|
||||
if(derp['Response'] != "Good to go!"):
|
||||
print derp['Response']
|
||||
sys.exit()
|
||||
sessionid = derp['SessionID']
|
||||
print "Logged in as " + derp['Username'] + "! Your session id is: " + sessionid
|
||||
if(options.server != ""):
|
||||
stuff = options.server
|
||||
else:
|
||||
stuff = raw_input("Enter host and port if any: ")
|
||||
if ':' in stuff:
|
||||
StuffEnteredIntoBox = stuff.split(":")
|
||||
host = StuffEnteredIntoBox[0]
|
||||
port = int(StuffEnteredIntoBox[1])
|
||||
else:
|
||||
host = stuff
|
||||
port = 25565
|
||||
connection = NetworkManager.ServerConnection(None, derp['Username'], passwd, sessionid, host, port, options)
|
||||
connection.start()
|
||||
while True:
|
||||
try:
|
||||
chat_input = raw_input()
|
||||
if (connection.isConnected):
|
||||
PacketSenderManager.send03(connection.grabSocket(), chat_input)
|
||||
else:
|
||||
pass
|
||||
except KeyboardInterrupt, e:
|
||||
connection.disconnect()
|
||||
sys.exit(1)
|
||||
|
|
Loading…
Reference in New Issue