Created
December 28, 2011 00:58
-
-
Save mrdaemon/1525603 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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) | |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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