Top

rstem.mcpi.connection module

import socket
import select
import sys
from .util import flatten_parameters_to_string

""" @author: Aron Nieminen, Mojang AB"""

class RequestError(Exception):
    pass

class Connection:
    """Connection to a Minecraft Pi game"""
    RequestFailed = "Fail"

    def __init__(self, address, port):
        self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        self.socket.connect((address, port))
        self.lastSent = ""

    def drain(self):
        """Drains the socket of incoming data"""
        while True:
            readable, _, _ = select.select([self.socket], [], [], 0.0)
            if not readable:
                break
            data = self.socket.recv(1500)
            e =  "Drained Data: <%s>\n"%data.strip()
            e += "Last Message: <%s>\n"%self.lastSent.strip()
            sys.stderr.write(e)

    def send(self, f, *data):
        """Sends data. Note that a trailing newline '\n' is added here"""
        s = "%s(%s)\n"%(f, flatten_parameters_to_string(data))
        #print "f,data:",f,data
        #print "s",s
        self.drain()
        self.lastSent = s
        self.socket.sendall(s.encode())

    def receive(self):
        """Receives data. Note that the trailing newline '\n' is trimmed"""
        s = self.socket.makefile("r").readline().rstrip("\n")
        if s == Connection.RequestFailed:
            raise RequestError("%s failed"%self.lastSent.strip())
        return s

    def sendReceive(self, *data):
        """Sends and receive data"""
        self.send(*data)
        return self.receive()

Classes

class Connection

Connection to a Minecraft Pi game

class Connection:
    """Connection to a Minecraft Pi game"""
    RequestFailed = "Fail"

    def __init__(self, address, port):
        self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        self.socket.connect((address, port))
        self.lastSent = ""

    def drain(self):
        """Drains the socket of incoming data"""
        while True:
            readable, _, _ = select.select([self.socket], [], [], 0.0)
            if not readable:
                break
            data = self.socket.recv(1500)
            e =  "Drained Data: <%s>\n"%data.strip()
            e += "Last Message: <%s>\n"%self.lastSent.strip()
            sys.stderr.write(e)

    def send(self, f, *data):
        """Sends data. Note that a trailing newline '\n' is added here"""
        s = "%s(%s)\n"%(f, flatten_parameters_to_string(data))
        #print "f,data:",f,data
        #print "s",s
        self.drain()
        self.lastSent = s
        self.socket.sendall(s.encode())

    def receive(self):
        """Receives data. Note that the trailing newline '\n' is trimmed"""
        s = self.socket.makefile("r").readline().rstrip("\n")
        if s == Connection.RequestFailed:
            raise RequestError("%s failed"%self.lastSent.strip())
        return s

    def sendReceive(self, *data):
        """Sends and receive data"""
        self.send(*data)
        return self.receive()

Ancestors (in MRO)

Class variables

var RequestFailed

Static methods

def __init__(

self, address, port)

def __init__(self, address, port):
    self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    self.socket.connect((address, port))
    self.lastSent = ""

def drain(

self)

Drains the socket of incoming data

def drain(self):
    """Drains the socket of incoming data"""
    while True:
        readable, _, _ = select.select([self.socket], [], [], 0.0)
        if not readable:
            break
        data = self.socket.recv(1500)
        e =  "Drained Data: <%s>\n"%data.strip()
        e += "Last Message: <%s>\n"%self.lastSent.strip()
        sys.stderr.write(e)

def receive(

self)

Receives data. Note that the trailing newline ' ' is trimmed

def receive(self):
    """Receives data. Note that the trailing newline '\n' is trimmed"""
    s = self.socket.makefile("r").readline().rstrip("\n")
    if s == Connection.RequestFailed:
        raise RequestError("%s failed"%self.lastSent.strip())
    return s

def send(

self, f, *data)

Sends data. Note that a trailing newline ' ' is added here

def send(self, f, *data):
    """Sends data. Note that a trailing newline '\n' is added here"""
    s = "%s(%s)\n"%(f, flatten_parameters_to_string(data))
    #print "f,data:",f,data
    #print "s",s
    self.drain()
    self.lastSent = s
    self.socket.sendall(s.encode())

def sendReceive(

self, *data)

Sends and receive data

def sendReceive(self, *data):
    """Sends and receive data"""
    self.send(*data)
    return self.receive()

Instance variables

var lastSent

var socket

class RequestError

class RequestError(Exception):
    pass

Ancestors (in MRO)

  • RequestError
  • builtins.Exception
  • builtins.BaseException
  • builtins.object

Class variables

var args