@Dinoclor
Thanks. Just to keep in mind, I still have to release the Python mirror. I can give you the source code for it, but I don't have a binary ready. Also, there is documentation for the newest supported version of FireMMO being written, but it isn't completely finished--it hasn't been perfected enough to be useful. In the mean time, you can ask me how to use the new version of FireMMO.
Thanks for interest in FireMMO,
-bobbybee (FireMMO Founder, FireMMO Owner, and FireMMO Lead Programmer)
Offline
http://www.py2exe.org/ - I'm not sure about an .app one though.
Offline
Alright. I'll try that.
Offline
By the way Magnie, can you test out my mirror. Here's the current source code (no errors):
# Scratch Mirror
# Version 1.5.0
# Originally by: Magnie. Modified by bobbybee for use in FireMMO
import socket # Network base
import time # For delaying purposes mostly.
import threading # So it can send and receive at the same time anytime.
import array
# ### ### ### ### ### ### ### ### ### ### ### ### ### ### ### ### #
# CHOST is the IP Scratch is running on, if you are running it #
# on this computer, then the IP is 127.0.0.1 #
# Theoretically you could run this Mirror on another computer. #
# ### ### ### ### ### ### ### ### ### ### ### ### ### ### ### ### #
# CPOST is the port Scratch is listening on, the default is #
# 42001. Usually this is only change by a Scratcher who knows a #
# about Squeak and networking with sockets. #
# ### ### ### ### ### ### ### ### ### ### ### ### ### ### ### ### #
CHOST = '127.0.0.1'
CPORT = 42001
# ### ### ### ### ### ### ### ### ### ### ### ### ### ### ### ### #
# SHOST is the IP the server is running on. #
# ### ### ### ### ### ### ### ### ### ### ### ### ### ### ### ### #
# SPORT is the port that the server is using. 42002 is the #
# unofficial port for Scratch Servers. The host will need to make #
# sure to port-forward the port so people can connect from the #
# internet. #
# ### ### ### ### ### ### ### ### ### ### ### ### ### ### ### ### #
SHOST = '127.0.0.1'
SPORT = 7070
# ### ### ### ### ### ### ### ### ### ### ### ### ### ### ### ### #
# Some extra settings that are more for advanced users are below. #
# ### ### ### ### ### ### ### ### ### ### ### ### ### ### ### ### #
# Time between checking the threads for broken ones.
THREADCHECK = 5
class Client(threading.Thread): # This class listens for messages sent from Scratch and sends it to the Server.
def parse_message(self, message):
if message:
sensors = {}
broadcasts = []
commands = []
i = 0
while True:
length = ord(message[i]) + ord(message[i+1]) + ord(message[i+2]) + ord(message[i+3])
command = message[i + 4:i + length + 4]
commands.append(command)
if (i + length + 4) < len(message):
i = (i+4) + length
else:
del command
break
for command in commands:
if command[0] == 'b':
command = command.split('"')
command.pop(0)
broadcasts.append(command[0])
elif command[0] == 's':
command = command.split('"')
command.pop(0)
command.remove(' ')
#command.remove('')
sensors[command[0]] = command[1]
return dict([('sensor-update', sensors), ('broadcast', broadcasts)])
else:
return None
def sendScratchCommand(self, cmd):
n = len(cmd)
a = array('c')
a.append(chr((n >> 24) & 0xFF))
a.append(chr((n >> 16) & 0xFF))
a.append(chr((n >> 8) & 0xFF))
a.append(chr(n & 0xFF))
server.sock.send(a.tostring() + cmd)
def __init__(self, CHOST, CPORT):
threading.Thread.__init__(self) # Initialize it, basically just separate it from the main thread.
self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # Defines the type of connection ( UPD, TCP on IPv4 or IPv6 )
print("Connecting to Scratch...")
self.sock.connect((CHOST, CPORT)) # Connect to Scratch
print("Connected to Scratch!")
def run(self):
global running
print "Listening for Scratch messages."
while running:
data = self.sock.recv(1024) # Wait for something to be sent to the mirror
data = self.parse_message(data)
for sensor in data['sensor-update']:
if sensor == "packet":
self.send(data['sensor-update'][sensor])
def send(self, message):
server.sock.send(message) # Send the data to the server.
class Server(threading.Thread): # This class listens for messages from the Server and sends it to Scratch.
def sendScratchCommand(self, cmd):
n = len(cmd)
a = []
a.append(chr((n >> 24) & 0xFF))
a.append(chr((n >> 16) & 0xFF))
a.append(chr((n >> 8) & 0xFF))
a.append(chr(n & 0xFF))
scratch.sock.send(''.join(a) + cmd)
def __init__(self, SHOST, SPORT):
threading.Thread.__init__(self) # Initialize it, basically just separate it from the main thread.
self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # Defines the type of connection ( UPD, TCP on IPv4 or IPv6 )
print("Connecting to Scratch Server...")
self.sock.connect((SHOST, SPORT)) # Connect to the Server.
print("Connected to Server!")
def run(self):
global running
print "Listening for Server messages."
while running:
data = self.sock.recv(1024) # Listens for messages sent from the Server.
self.sendScratchCommand("sensor-update packet \""+data+"\"");
self.sendScratchCommand("broadcast dataready")
def send(self, message):
scratch.sock.send(message) # Sends messages to Scratch.
running = 1
scratch = Client(CHOST, CPORT) # Start up the class for Scratch
scratch.start() # This starts the 'run' function.
server = Server(SHOST, SPORT) # Start up the class for Server
server.start() # This starts the 'run' function on the class as well.
while running:
time.sleep(THREADCHECK) # The longer the wait time, the less CPU is used I think.
try: # Check if the either thread died ( or exists anymore ).
if scratch: pass
if server: pass
except: # If either are dead, end the program.
running = 0
print "Finished running."Offline
By the way, I set up a small FireMMO website with an actual builder. (I used weebly) You can access it here. firemmo.tk
Offline
This is a useful script:
set [i] to [1] set [j] to [1] delete [all] of [split] add [] to split repeat until <(i) > (length of (inpacket))> if <letter (i) of (inpacket) = [/]> change [j] by [1] add [] to split else replace (item (j) of [split]) with (join item (j) of [split]) end change [i] by [1] end
Last edited by bobbybee (2012-02-20 06:21:24)
Offline
I can make a website for you.
(I handcode fresh HTML, PHP and CSS.)
Offline
If you want to use the stuff I put on a website above, tell me. If it looks good enough I'll call it the real website. Else, I'll just stick to an editor.
Offline
I'm getting this error (hopefully this is the last one)
Exception in thread Thread-1:
Traceback (most recent call last):
File "/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/threading.py", line 522, in __bootstrap_inner
self.run()
File "mirror.py", line 99, in run
data = self.parse_message(data)
File "mirror.py", line 70, in parse_message
command.remove(' ')
ValueError: list.remove(x): x not in list
# Scratch Mirror
# Version 1.5.0
# Originally by: Magnie. Modified by bobbybee for use in FireMMO
import socket # Network base
import time # For delaying purposes mostly.
import threading # So it can send and receive at the same time anytime.
import array
# ### ### ### ### ### ### ### ### ### ### ### ### ### ### ### ### #
# CHOST is the IP Scratch is running on, if you are running it #
# on this computer, then the IP is 127.0.0.1 #
# Theoretically you could run this Mirror on another computer. #
# ### ### ### ### ### ### ### ### ### ### ### ### ### ### ### ### #
# CPOST is the port Scratch is listening on, the default is #
# 42001. Usually this is only change by a Scratcher who knows a #
# about Squeak and networking with sockets. #
# ### ### ### ### ### ### ### ### ### ### ### ### ### ### ### ### #
CHOST = '127.0.0.1'
CPORT = 42001
# ### ### ### ### ### ### ### ### ### ### ### ### ### ### ### ### #
# SHOST is the IP the server is running on. #
# ### ### ### ### ### ### ### ### ### ### ### ### ### ### ### ### #
# SPORT is the port that the server is using. 42002 is the #
# unofficial port for Scratch Servers. The host will need to make #
# sure to port-forward the port so people can connect from the #
# internet. #
# ### ### ### ### ### ### ### ### ### ### ### ### ### ### ### ### #
SHOST = '127.0.0.1'
SPORT = 7070
# ### ### ### ### ### ### ### ### ### ### ### ### ### ### ### ### #
# Some extra settings that are more for advanced users are below. #
# ### ### ### ### ### ### ### ### ### ### ### ### ### ### ### ### #
# Time between checking the threads for broken ones.
THREADCHECK = 5
class Client(threading.Thread): # This class listens for messages sent from Scratch and sends it to the Server.
def parse_message(self, message):
if message:
sensors = {}
broadcasts = []
commands = []
i = 0
while True:
length = ord(message[i]) + ord(message[i+1]) + ord(message[i+2]) + ord(message[i+3])
command = message[i + 4:i + length + 4]
commands.append(command)
if (i + length + 4) < len(message):
i = (i+4) + length
else:
del command
break
for command in commands:
if command[0] == 'b':
command = command.split('"')
command.pop(0)
broadcasts.append(command[0])
elif command[0] == 's':
command = command.split('"')
command.pop(0)
command.remove(' ')
#command.remove('')
sensors[command[0]] = command[1]
return dict([('sensor-update', sensors), ('broadcast', broadcasts)])
else:
return None
def sendScratchCommand(self, cmd):
n = len(cmd)
a = array('c')
a.append(chr((n >> 24) & 0xFF))
a.append(chr((n >> 16) & 0xFF))
a.append(chr((n >> 8) & 0xFF))
a.append(chr(n & 0xFF))
server.sock.send(a.tostring() + cmd)
def __init__(self, CHOST, CPORT):
threading.Thread.__init__(self) # Initialize it, basically just separate it from the main thread.
self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # Defines the type of connection ( UPD, TCP on IPv4 or IPv6 )
print("Connecting to Scratch...")
self.sock.connect((CHOST, CPORT)) # Connect to Scratch
print("Connected to Scratch!")
def run(self):
global running
print "Listening for Scratch messages."
while running:
data = self.sock.recv(1024) # Wait for something to be sent to the mirror
data = self.parse_message(data)
for sensor in data['sensor-update']:
if sensor == "packet":
self.send(data['sensor-update'][sensor])
def send(self, message):
server.sock.send(message) # Send the data to the server.
class Server(threading.Thread): # This class listens for messages from the Server and sends it to Scratch.
def sendScratchCommand(self, cmd):
n = len(cmd)
a = []
a.append(chr((n >> 24) & 0xFF))
a.append(chr((n >> 16) & 0xFF))
a.append(chr((n >> 8) & 0xFF))
a.append(chr(n & 0xFF))
scratch.sock.send(''.join(a) + cmd)
def __init__(self, SHOST, SPORT):
threading.Thread.__init__(self) # Initialize it, basically just separate it from the main thread.
self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # Defines the type of connection ( UPD, TCP on IPv4 or IPv6 )
print("Connecting to Scratch Server...")
self.sock.connect((SHOST, SPORT)) # Connect to the Server.
print("Connected to Server!")
def run(self):
global running
print "Listening for Server messages."
while running:
data = self.sock.recv(1024) # Listens for messages sent from the Server.
self.sendScratchCommand("sensor-update packet \""+data+"\"");
self.sendScratchCommand("broadcast dataready")
def send(self, message):
scratch.sock.send(message) # Sends messages to Scratch.
running = 1
scratch = Client(CHOST, CPORT) # Start up the class for Scratch
scratch.start() # This starts the 'run' function.
server = Server(SHOST, SPORT) # Start up the class for Server
server.start() # This starts the 'run' function on the class as well.
while running:
time.sleep(THREADCHECK) # The longer the wait time, the less CPU is used I think.
try: # Check if the either thread died ( or exists anymore ).
if scratch: pass
if server: pass
except: # If either are dead, end the program.
running = 0
print "Finished running."Offline
Write a print statement after the command.pop(0) that prints the contents of command. Cause apparently ' ' doesn't exist in the command list.
Offline
['inpacket', ' ', 'Fxt/m/bobbybee/Hello, World!/Fxt/m/bobbybee/Hello, World!/Fxt/m/bobbybee']
['inpacket', ' ', 'Fxt/m/bobbybee/Hello, World!/Fxt/m/bobbybee/Hello, World!/Fxt/m/bobbybee/Hello, World!/Fxt/m/bobbybee']
[]
Exception in thread Thread-1:
Traceback (most recent call last):
File "/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/threading.py", line 522, in __bootstrap_inner
self.run()
File "mirror.py", line 100, in run
data = self.parse_message(data)
File "mirror.py", line 71, in parse_message
command.remove(' ')
ValueError: list.remove(x): x not in list
Offline
bobbybee wrote:
['inpacket', ' ', 'Fxt/m/bobbybee/Hello, World!/Fxt/m/bobbybee/Hello, World!/Fxt/m/bobbybee']
['inpacket', ' ', 'Fxt/m/bobbybee/Hello, World!/Fxt/m/bobbybee/Hello, World!/Fxt/m/bobbybee/Hello, World!/Fxt/m/bobbybee']
[]
Exception in thread Thread-1:
Traceback (most recent call last):
File "/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/threading.py", line 522, in __bootstrap_inner
self.run()
File "mirror.py", line 100, in run
data = self.parse_message(data)
File "mirror.py", line 71, in parse_message
command.remove(' ')
ValueError: list.remove(x): x not in list
Yeah you are trying to to delete ' ' instead of ''. So try commenting out that line then remove the comment for command.remove('').
Offline
Okay.
Offline
Connecting to Scratch...
Connected to Scratch!
Listening for Scratch messages.
Connecting to Scratch Server...
Connected to Server!
Listening for Server messages.
['g', ' 0 ', 'i', ' 769 ', 'inpacket', ' ', 'b/hello/Fxt/m/bobbybee/hello/Fxt/m/bobbybee/hello/Fxt/m/bobbybee/hello/Fxt/m/bobbybee/hello/Fxt/m/bobbybee/hell']
Exception in thread Thread-1:
Traceback (most recent call last):
File "/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/threading.py", line 522, in __bootstrap_inner
self.run()
File "mirror.py", line 100, in run
data = self.parse_message(data)
File "mirror.py", line 72, in parse_message
command.remove('')
ValueError: list.remove(x): x not in list
Offline
bump.
Offline
Hmm, I'm not sure. I guess you just put try: except: around them, like so:
try:
command.remove(' ')
except ValueError:
passOffline
It worked, but I still got a error in the process:
Connecting to Scratch...
Connected to Scratch!
Listening for Scratch messages.
Connecting to Scratch Server...
Connected to Server!
Listening for Server messages.
['g', ' 1 ', 'i', ' 1 ', 'inpacket', ' ', '', ' ', 'j', ' 1 ', 'message', ' ', 'What do you no about telnet?e', ' ', 'name', ' ', 'bobbybee', ' ', 'packet', ' ', 'Fxt/m/bobbybee/Hello, World!/', ' ']
['packet', ' ', 'Fxt/m/bobbybee/dataready/', ' ']
['g', ' 2 ', 'i', ' 2 ', 'inpacket', ' ', 'Fxt/m/']
Exception in thread Thread-1:
Traceback (most recent call last):
File "/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/threading.py", line 522, in __bootstrap_inner
self.run()
File "mirror.py", line 102, in run
data = self.parse_message(data)
File "mirror.py", line 65, in parse_message
broadcasts.append(command[0])
IndexError: list index out of range
I have a feeling it has to do with the list/array initialization.
Offline
No...
Offline
i'm good at scratch and GML
Offline
GameMaker won't really help you, but you can help make Scratch stuff. I'll be releasing a little chat project soon.
Offline
bobbybee wrote:
It worked, but I still got a error in the process:
Connecting to Scratch...
Connected to Scratch!
Listening for Scratch messages.
Connecting to Scratch Server...
Connected to Server!
Listening for Server messages.
['g', ' 1 ', 'i', ' 1 ', 'inpacket', ' ', '', ' ', 'j', ' 1 ', 'message', ' ', 'What do you no about telnet?e', ' ', 'name', ' ', 'bobbybee', ' ', 'packet', ' ', 'Fxt/m/bobbybee/Hello, World!/', ' ']
['packet', ' ', 'Fxt/m/bobbybee/dataready/', ' ']
['g', ' 2 ', 'i', ' 2 ', 'inpacket', ' ', 'Fxt/m/']
Exception in thread Thread-1:
Traceback (most recent call last):
File "/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/threading.py", line 522, in __bootstrap_inner
self.run()
File "mirror.py", line 102, in run
data = self.parse_message(data)
File "mirror.py", line 65, in parse_message
broadcasts.append(command[0])
IndexError: list index out of range
I have a feeling it has to do with the list/array initialization.
Yeah, there was a blank broadcast or something. I'd probably have to see the entire commands list.
Offline
What should I change to prevent this issue, then? Or how should I dump the commands list?
Offline