Skip to content

Instantly share code, notes, and snippets.

@mrdaemon
Created December 28, 2011 00:58
Show Gist options
  • Save mrdaemon/1525603 to your computer and use it in GitHub Desktop.
Save mrdaemon/1525603 to your computer and use it in GitHub Desktop.
from twisted.internet.protocol import Factory
from twisted.protocols.basic import LineReceiver
"""
Protocols/Transports for slop
STATUS CODES CHEAT SHEET:
1xx - informational messages
100 - Connection Established / Banner
101 - MOTD / Admin Message
110 - Server status message
2xx - success messages
200 - Successfully Executed
201 - Successfully Executed, data follows
220 - logged in, ready for service
250 - Client data
3xx - transient/completion pending, requests for data
301 - Request for login
4xx - client errors (try again, not found, etc)
401 - Invalid or Malformed username
402 - Invalid Password
403 - Forbidden/Unauthorized
404 - Resource not found
5xx - server errors (internal errors, fatal/final errors)
"""
class SSAI(LineReceiver):
""" Slop's Shitty ASCII Interface
Default protocol over TCP/IP
"""
def __init__(self, users):
self.users = users
self.name = None
self.state = "LOGIN"
def connectionMade(self):
print "Client connected."
self.sendLine("100 Connected")
self.sendLine("100 slopd version 0.00")
self.sendLine("301 login required")
def connectionLost(self, reason):
if self.users.has_key(self.name):
del self.users[self.name]
print "%s has disconnected."
def lineReceived(self, line):
if self.state == "LOGIN":
print "Client login: %s" % (line,)
self.handle_LOGIN(line)
else:
print "Client message from %s: %s" % (self.name, line)
self.handle_COMMAND(line)
def handle_LOGIN(self, name):
if self.users.has_key(name):
print "Username %s is already in use" % (name,)
self.sendLine("330 Username already taken, login required")
return
print "User %s logged in." % (self.name)
self.sendLine("220 Welcome, %s" % (name,))
self.name = name
self.users[name] = self
self.state = "COMMAND"
def handle_COMMAND(self, message):
print "Command from %s: %s" % (self.name, message)
message = "<%s> %s" % (self.name, message)
for name, client in self.users.iteritems():
if client != self:
client.sendLine(message)
class SSAIFactory(Factory):
def __init__(self):
self.users = {} # user names -> client instances
def buildProtocol(self, addr):
return SSAI(self.users)
from twisted.internet import reactor
from slop.protocols import SSAIFactory
def main():
print "slopd server version 0.00"
reactor.listenTCP(8008, SSAIFactory())
reactor.run()
if __name__ == "__main__":
main()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment