/* /secure/cmds/creators/dsversion.c * Created by Brodbane of Eve * Date Created: 4/1/06 */ #include <lib.h> #include <network.h> #include <socket_err.h> #include <message_class.h> inherit LIB_DAEMON; #define HTTP_ADDRESS "204.209.44.12" #define HTTP_HOST "lpmuds.net" #define HTTP_PORT 80 #define HTTP_PATH "/forum/index.php?type=rss;action=.xml" #define NOTES_DELIM "----" #define SAVE_FILE "/doc/RELEASE_NOTES_HTTP" #define SOCK_FIND 0 #define SOCK_CONNECTING 1 #define SOCK_CONNECTED 2 #define SOCK_DISCONNECTED 3 #define SOC_ERROR 4 #define _DEBUG int socket; int status; object player; object person; mapping Feeds = ([]); mapping Sockets = ([]); string results, s; void sendHTTPGet(); void Setup(); int http_file_found; private string args_list; void create(){ daemon::create(); if(!Feeds) Feeds = ([]); if(!Sockets) Sockets = ([]); call_out((: Setup :), 2); } void add_feed(string name, mapping feed){ Feeds[name] = feed; } void Setup(){ set_heart_beat(1); add_feed("lpmuds-forum", ([ "name": "LPMuds.net", "ip_port": "204.209.44.12 80", "host": "lpmuds.net", "req": "GET /forum/index.php?type=rss;action=.xml HTTP/1.0", "wait": 15, "min_wait": 2, "max_wait": 15, "timer": -1, "userid": "LPMuds", ]) ); add_feed("tmc-forums", ([ "name": "Mudconnect.com Forums", "ip_port": "66.150.96.119 80", "host": "feeds.feedburner.com", "req": "GET /TMCForums HTTP/1.0", "wait": 15, "min_wait": 2, "max_wait": 20, "timer": -1, "userid": "TMC", ]) ); add_feed("tmc-mudconnect", ([ "name": "Mudconnect.com", "ip_port": "66.150.96.119 80", "host": "feeds.feedburner.com", "req": "GET /Mudconnect HTTP/1.0", "wait": 15, "min_wait": 2, "max_wait": 30, "timer": -1, "userid": "TMC", ]) ); add_feed("mudbytes-forum", ([ "name": "MudBytes", "ip_port": "209.190.9.170 80", "host": "www.mudbytes.net", "req": "GET /index.php?a=rssfeed HTTP/1.0", "wait": 15, "min_wait": 2, "max_wait": 15, "timer": -1, "userid": "MudBytes", ]) ); add_feed("smaugmuds-forum", ([ "name": "SmaugMuds.org", "ip_port": "66.218.49.113 80", "host": "www.smaugmuds.org", "req": "GET /index.php?a=rssfeed HTTP/1.0", "wait": 15, "min_wait": 2, "max_wait": 15, "timer": -1, "userid": "SmaugMuds", ]) ); add_feed("topmudsites-forum", ([ "name": "Top Mud Sites Forum", "ip_port": "72.232.233.194 80", "host": "www.topmudsites.com", "req": "GET /forums/external.php?type=RSS2&lastpost=true HTTP/1.0", "append": ([ "ext": ".html", "string": "-new-post" ]), "wait": 15, "min_wait": 2, "max_wait": 15, "timer": -1, "userid": "TMS", ]) ); add_feed("arthmoor-forum", ([ "name": "Arthmoor Internet Services: MUD Hosting", "ip_port": "66.218.49.113 80", "host": "www.arthmoor.com", "req": "GET /forum/index.php?a=rssfeed HTTP/1.0", "wait": 15, "min_wait": 2, "max_wait": 3 * 60, "timer": -1, "userid": "Arthmoor", ]) ); add_feed("mudmagic-lpc", ([ "name": "Mud Magic: LPC Lounge", "ip_port": "67.19.238.52 80", "host": "www.mudmagic.com", "req": "GET /rss/boards/26 HTTP/1.0", "wait": 15, "min_wait": 2, "max_wait": 3 * 60, "timer": -1, "userid": "MudMagic", ]) ); add_feed("mudmagic-staff", ([ "name": "Mud Magic: Staff Wanted", "ip_port": "67.19.238.52 80", "host": "www.mudmagic.com", "req": "GET /rss/boards/5 HTTP/1.0", "wait": 15, "min_wait": 2, "max_wait": 60, "timer": -1, "userid": "MudMagic", ]) ); add_feed("metaplace-news", ([ "name": "Metaplace.com Developer's Blog", "ip_port": "66.150.96.119 80", "host": "feeds.feedburner.com", "req": "GET /metaplace HTTP/1.0", "char-encoding": "utf8", "wait": 15, "min_wait": 2, "max_wait": 60, "timer": -1, "userid": "Metaplace", ]) ); add_feed("theonion", ([ "name": "The Onion", "ip_port": "66.150.96.119 80", "host": "feeds.theonion.com", "req": "GET /theonion/daily HTTP/1.0", "sortBy": "pubDate", "char-encoding": "utf8", "wait": 15, "min_wait": 2, "max_wait": 24 * 60, "timer": -1, "userid": "TheOnion", ]) ); } mixed ProcessHTTPResult(int fd) { string * parts; string * arg_array; string * temp; write_file("/tmp/"+Sockets[fd]["name"],Sockets[fd]["result"]); //parts = explode( results, NOTES_DELIM ); return 1; } void read_callback( int fd, mixed message ) { Sockets[fd]["result"] += message; } void write_callback( int fd ) { #ifdef _DEBUG player->eventPrint("Connected!"); #endif status = SOCK_CONNECTED; http_file_found = 0; sendHTTPGet(); } void close_callback( int fd ) { if( status == SOCK_CONNECTED ) { // Process HTML here #ifdef _DEBUG player->eventPrint("Connection closed by host."); #endif ProcessHTTPResult(fd); } if( status == SOCK_CONNECTING ) { player->eventPrint("Connection attempt failed."); } socket_close( fd ) ; map_delete(Sockets,fd); status = SOCK_DISCONNECTED; } void sendHTTPGet() { string str =Feeds[args_list]["req"]+CARRIAGE_RETURN+"\n"+ "Host: "+Feeds[args_list]["host"]+CARRIAGE_RETURN"\n" + "User-Agent: RSS_D@" + mud_name() + " " + mudlib()+ "/" + mudlib_version() +" ("+ query_os_type()+";) "+ version() + CARRIAGE_RETURN+"\n"+CARRIAGE_RETURN+"\n"; int result = 0; results = ""; #ifdef _DEBUG player->eventPrint("Sending HTTP get request..." ); #endif if( status == SOCK_CONNECTED ) { result = socket_write( socket, (string)str ); #ifdef _DEBUG player->eventPrint( "HTTP request sent to " + socket + " result = "+result ); #endif } } int openHTTPConnection() { int sock, sc_result; string error; status = SOCK_FIND; status = SOCK_CONNECTING; sock = socket_create( STREAM, "read_callback", "close_callback" ) ; if (sock < 0) { switch( sock ) { case EEMODENOTSUPP : error = "Socket mode not supported.\n" ; break ; case EESOCKET : error = "Problem creating socket.\n" ; break ; case EESETSOCKOPT : error = "Problem with setsockopt.\n" ; break ; case EENONBLOCK : error = "Problem with setting non-blocking mode.\n" ; break ; case EENOSOCKS : error = "No more available efun sockets.\n" ; break ; case EESECURITY : error = "Security violation attempted.\n" ; break ; default : error = "Unknown error code: " + sock + ".\n" ; break ; } notify_fail( "Unable to connect, problem with socket_create.\n" "Reason: " + error ) ; return 0 ; } write("Attempting to connect to "+HTTP_HOST+ " on port "+ HTTP_PORT + "\n"); sc_result = socket_connect( sock, Feeds[args_list]["ip_port"], "read_callback", "write_callback" ) ; if( sc_result != EESUCCESS ) { status = SOCK_DISCONNECTED; notify_fail( "Failed to connect.\n" ) ; return 0 ; } else{ #ifdef _DEBUG player->eventPrint( "Socket connecting..." ); #endif } socket = sock; Sockets[socket] = ([ "inception" : time(), "name" : args_list, "result" : "" ]); return 1; } void hostResolved( string address, string resolved, int key ) { if( !resolved ){ #ifdef _DEBUG player->eventPrint( "Unable to resolve "+address ); #endif return; } #ifdef _DEBUG player->eventPrint( "Resolved "+address+" to "+ resolved ); #endif player->eventPrint( "Retrieving updated release notes from: http://www.dead-souls.net\n" ); openHTTPConnection(); } void resolveHost() { resolve( HTTP_HOST, "hostResolved" ); } mixed cmd(string args) { if(args == "list"){ write("Known feeds: "+implode(keys(Feeds),", ")); return 1; } player = previous_object(); if(args) args_list = args; else args_list = "lpmuds-forum"; rm("/tmp/"+args_list); openHTTPConnection(); return 1; } string GetErorMessage() { return "There was a problem"; } string GetHelp() { return ("Syntax: dsversion [version]\n\n" + "Shows the latest version of Dead Souls and release notes.\n"+ "e.g. dsversion, dsversion r1, dsversion 2.0r1"); }