1 /* Copyright (C) 2000-2004 Thomas Bopp, Thorsten Hampel, Ludger Merkens
3 * This program is free software; you can redistribute it and/or modify
4 * it under the terms of the GNU General Public License as published by
5 * the Free Software Foundation; either version 2 of the License, or
6 * (at your option) any later version.
8 * This program is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 * GNU General Public License for more details.
13 * You should have received a copy of the GNU General Public License
14 * along with this program; if not, write to the Free Software
15 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
17 * $Id: telnet.pike,v 1.2 2009/05/04 19:16:48 astra Exp $
19 inherit "/net/coal/login";
20 inherit "/net/base/readline";
21 inherit "/net/base/cmd";
27 #include <attributes.h>
29 class telnet : public login,readline,cmd{
36 #define MODE_CONNECT 0
40 #define MODE_MORE_INPUT 4
43 mapping mMode= ([ "cmd":0 ]);
47 mapping(string:string) mCreate = ([]);
56 * creates an new user and activates him. adduser is called in Mode_Create several times.
58 int cmd_adduser(string cmd, string|void args)
60 if (iMode == MODE_CMD) {
61 iMode = MODE_MORE_INPUT;
63 mCreate["name"] = args;
64 send_message("Weitere Daten werden zum Anlegen des Nutzers \"" + args + "\" benötigt.\n");
65 send_message("Passwort des Nutzers:");
69 mCreate["name"] = args;
71 send_message("Passwort des Nutzers:");
76 send_message("E-Mail des Nutzers:");
79 mCreate["email"] = cmd;
80 LOG("now fetching factory\n");
81 object factory = _Server->get_factory(CLASS_USER);
82 LOG("Now executing factory\n");
83 object user = factory->execute(mCreate);
84 LOG("Factory executed");
86 send_message("Ein Fehler ist aufgetreten. Nutzer wurde nicht angelegt\n");
88 LOG("Now activating user.\n");
89 if (user->activate_user(factory->get_activation())) {
90 send_message("Nutzer wurde angelegt und aktiviert.\n");
92 send_message("Nutzer wurde angelegt, aber nicht aktiviert!\n");
103 void addlink(object to)
105 mapping (string:object) mName = ([]);
106 mName["link_to"] = to;
107 object factory = _Server->get_factory(CLASS_LINK);
108 object link = factory->execute(mName);
110 send_message("Ein Fehler ist aufgetreten. Der Link konnte nicht angelegt werden.\n");
112 send_message("Der Link wurde angelegt. Seine ID ist " + link->get_object_id() );
117 void create_object(string type, string name)
121 mapping (string:string) mName = ([]);
122 mName["name"] = name;
123 object factory = _Server->get_factory(type);
126 send_message("Es gibt keine Klasse vom typ '"+type+"'.\n");
129 err = catch{ newobject = factory->execute(mName); };
132 send_message("Ein Fehler ist aufgetreten. Das Objekt konnte nicht angelegt werden:\n"+err[0]+"\n");
133 LOG(sprintf("%O", err));
137 send_message("Das Objekt wurde angelegt. Seine ID ist " + newobject->get_object_id() );
138 newobject->move(oUser->get_environment());
144 * Shows the inventory of the given object
145 * grouped by the object classes
147 * @param object obj - the target object
148 * @return the inventory formatted as string
151 string show_inventory(object obj) {
154 // NOT COMPLETE !(see also "classes.h")
155 mapping classes_names = ([ CLASS_USER:CLASS_NAME_USER,
156 CLASS_OBJECT:CLASS_NAME_OBJECT,
157 CLASS_CONTAINER:CLASS_NAME_CONTAINER,
158 CLASS_ROOM:CLASS_NAME_ROOM,
159 CLASS_DOCUMENT:CLASS_NAME_DOCUMENT,
160 CLASS_LINK:CLASS_NAME_LINK,
161 CLASS_GROUP:CLASS_NAME_GROUP,
162 CLASS_EXIT:CLASS_NAME_EXIT,
164 CLASS_MESSAGEBOARD:"Messageboard",
165 CLASS_GHOST:CLASS_NAME_GHOST,
166 CLASS_TRASHBIN:CLASS_NAME_TRASHBIN,
167 /*,CLASS_SHADOW:"Shadow"*/ ]);
172 if (arrayp(obj->get_inventory())) {
173 res = res +"\nThis is the inventory of "
174 + obj->get_identifier() +":\n";
175 res += "----------------------------------------------------\n";
176 foreach (indices(classes_names), int cl) {
177 array inventory_class =
178 obj->get_inventory_by_class(cl);
181 if (arrayp(inventory_class) && sizeof(inventory_class)>0) {
182 res += " " + classes_names[cl] +":\n";
183 foreach (inventory_class, object inv_obj) {
185 string ident = inv_obj->get_identifier();
186 int id = inv_obj->get_object_id();
189 res += sprintf (" %s[%d]", ident, id);
196 res += "\n No objects in the inventory.\n";
199 res = res +"\""+obj->get_identifier()+"\" has no inventory.\n";
208 void send_room(object room)
210 if ( objectp(room) ) {
212 "[#"+room->get_object_id() + ","+_FILEPATH->object_to_filename(room)+"]\n"+
213 "You are in a large area called " + room->get_identifier() + ".\n"+
214 "There are the following exits:\n");
215 array inv = room->get_inventory();
216 foreach(inv, object o) {
217 if ( o->get_object_class() & CLASS_EXIT )
218 send_message(o->get_identifier()+",");
220 send_message("\nThere are the following people:\n");
221 array users = room->get_inventory_by_class(CLASS_USER);
222 foreach(users, object u) {
223 send_message(u->get_identifier()+",");
228 send_message("You are in the big black void.\n");
235 void enter_room(object room, void|object from)
238 oUser->dispose_event(EVENT_SAY|EVENT_LEAVE_INVENTORY|EVENT_ENTER_INVENTORY, from);
240 oUser->listen_to_event(EVENT_SAY, room);
241 oUser->listen_to_event(EVENT_LEAVE_INVENTORY, room);
242 oUser->listen_to_event(EVENT_ENTER_INVENTORY, room);
247 void notify(int event, mixed ... args)
249 LOG("SAY: "+sprintf("%O\n", args));
250 object user = this_user();
251 LOG("oUser="+sprintf("%O", oUser));
252 LOG("user="+sprintf("%O", user));
253 if ( !objectp(oUser) || !objectp(user) )
255 LOG("sending event response !");
259 send_message(user->get_identifier() + " tells you: " + args[2]+"\n");
263 send_message("You say: "+args[2]+"\n");
265 send_message(user->get_identifier() + " says: "+args[2]+"\n");
267 case EVENT_ENTER_INVENTORY:
268 if ( args[1] == oUser ) {
269 send_message("You move to " + args[0]->get_identifier()+"\n");
272 send_message(args[1]->get_identifier() + " enters the room.\n");
273 send_message("%O:%O\n", args[1]->get_status(), args[1]->get_status()& CLIENT_FEATURES_MOVE);
276 case EVENT_LEAVE_INVENTORY:
277 send_message(args[1]->get_identifier() + " leaves the room.\n");
282 int cmd_delete(string cmd, string args)
285 sscanf(args,"#%i",id);
287 object oTmp=find_object(id);
290 mixed err = catch { oTmp->delete(); };
291 if (err!=0) send_message("Failed to delete Object #"+id+"\r\n");
292 else send_message("Deleted Object #"+id+"\r\n");
294 else send_message("Unable to find Object #"+id+"\r\n");
298 int cmd_take(string cmd, string args)
301 sscanf(args,"#%i",id);
303 object oTmp=find_object(id);
306 mixed err = catch { oTmp->move(oUser); };
307 if (err!=0) send_message("Cannot take object #"+id+"\r\n");
308 else send_message("Object #"+id+" is now in your inventory!\r\n");
310 else send_message("Can't find Object #"+id+"\r\n");
314 int cmd_drop(string cmd, string args)
317 sscanf(args,"#%i",id);
319 object oTmp=find_object(id);
323 //check if object is in user's inventory
324 array oaInv = oUser->get_inventory();
325 foreach( oaInv, object item )
327 if ( item->get_object_id() == id )
329 mixed err = catch { oTmp->move(oUser->get_environment()); };
330 if (err!=0) send_message("Cannot drop object #"+id+"\r\n");
331 else send_message("Dropped Object #"+id+"\r\n");
335 // foreach did not find object in user's inventory
336 send_message("Object #"+id+" is not in your inventory!\r\n");
338 else send_message("Can't find Object #"+id+"\r\n");
342 int cmd_quit(string cmd, string args)
345 oUser->set_attribute("telnet_history", readln->readline->historyobj->encode()/"\n");
346 send_message("Bye %s, see you again soon!\n", oUser->get_identifier());
352 int cmd_look(string cmd, string args)
354 //send_room(oUser->get_environment());
355 object oRoom = oUser->get_environment();
356 send_message(show_inventory(oRoom));
360 int cmd_inv(string cmd, string args)
364 if ( sscanf(args, "#%d",oid) == 1)
365 obj = find_object(oid);
368 LOG("Inventory of User");
371 send_message(show_inventory(obj));
375 int cmd_say(string cmd, string args)
377 object env = oUser->get_environment();
382 int cmd_tell(string cmd, string args)
387 if ( sscanf(args, "%s %s", user, msg) != 2 ) {
388 send_message("Usage is tell <user> <message>.\n");
391 target = _Persistence->lookup_user(user);
392 if ( !objectp(target) ){
393 send_message("Failed to find user '"+user+"'.\n");
396 target->message(msg);
397 send_message("You told " + user + ": "+msg+"\n");
401 int cmd_move(string cmd, string args)
403 object env = oUser->get_environment();
408 send_message("Going home now...");
409 exit = oUser->query_attribute(USER_WORKROOM);
411 else if ( sscanf(args, "#%d", id) == 1 )
412 exit = find_object(id);
413 else if(sizeof(args))
414 exit = env->get_object_byname(args);
416 send_message(cmd + " where?\n");
420 mixed err = catch { oUser->move(exit); };
423 send_message("Failed to move there...\n");
427 enter_room(oUser->get_environment(), env);
428 //send_room(oUser->get_environment());
429 send_message(show_inventory(oUser->get_environment()));
432 else if(sizeof(args))
433 send_message("The exit '" + args + "' was not found.\n");
438 int cmd_create(string cmd, string args)
441 create_object(tmp[0], tmp[1..]*" ");
445 int cmd_addroom(string cmd, string args)
447 create_object("Room", args);
451 int cmd_addcontainer(string cmd, string args)
453 create_object("Container", args);
457 int cmd_addlink(string cmd, string args)
461 if ( sscanf(args, "#%d",objectid) == 1) {
462 room = find_object(objectid);
465 send_message("Es gibt keinen Raum mit der Angegebenen ID.");
470 int cmd_execute_cmd(string cmd, string args)
472 send_message("\n"+execute(" "+args)+"\n");
476 // copied from masterlist.pike
478 int cmd_load(string cmd, string args)
481 sscanf(args,"#%i",iOID);
483 find_object(iOID)->get_identifier();
487 int cmd_upgrade(string cmd, string args)
491 [option, iOID] = array_sscanf(args,"%s#%i");
493 if(option=="--force " || option=="-f ")
499 pOID = find_object(iOID);
501 if(!pOID && master()->programs[option])
502 target=master()->programs[option];
503 else if (pOID->status() <= PSTAT_DISK) {
504 send_message("Use Load instead\n");
508 target=object_program(pOID->get_object());
511 send_message("could not find program\n");
515 send_message("upgrading...\n");
517 mixed res = master()->upgrade(target, force);
519 send_message("Upgrade failed, try --force\n");
521 send_message("Result: %s\n", (string)res);
526 mapping(string:function) run_commands = ([ "l":cmd_look,
536 "adduser":cmd_adduser,
537 "addroom":cmd_addroom,
538 "addcontainer":cmd_addcontainer,
539 "addlink":cmd_addlink,
541 "upgrade":cmd_upgrade,
543 "cmd":cmd_execute_cmd,
551 int handle_command(string cmd)
554 sscanf(cmd, "%s %s", cmd, args);
555 mMode->cmd=run_commands[cmd];
556 if(run_commands[cmd])
557 return run_commands[cmd](cmd, args);
564 void process_command(string cmd)
569 send_message("Welcome to sTeam\n: ");
570 send_message("Login: ");
574 tmpUser = _Persistence->lookup_user(cmd);
575 if ( !objectp(tmpUser) )
577 send_message("User '"+cmd+"' does not exist !\n");
578 send_message("Login: ");
582 readln->set_secret( 1 );
583 send_message("Password for "+cmd+": ");
588 if ( objectp(tmpUser) && tmpUser->check_user_password(cmd) ) {
589 send_message("Hi, " + tmpUser->get_identifier() + " - last seen "+
591 ctime(tmpUser->query_attribute(USER_LAST_LOGIN)));
594 enter_room(tmpUser->get_environment());
595 //send_room(tmpUser->get_environment());
596 send_message(show_inventory(tmpUser->get_environment()));
598 readln->set_secret( 0 );
599 tmpUser->listen_to_event(EVENT_TELL, tmpUser);
602 array history=tmpUser->query_attribute("telnet_history");
605 readln->readline->historyobj=readln->readline->History(512, history+({ "" }));
607 readln->readline->historyobj->delta_history(sizeof(history));
614 send_message("Wrong password, please try again: ");
617 tmpUser->disconnect();
622 case MODE_MORE_INPUT:
626 if ( strlen(cmd) != 0 && !handle_command(cmd) )
627 send_message("The command %O was not understood.\n", cmd);
628 send_message("["+_FILEPATH->object_to_path(oUser)+"] > ");
635 int get_client_features() { return CLIENT_FEATURES_ALL; }
636 string get_socket_name() { return "telnet"; }
638 // allow user to store stuff somewhere
639 mapping temp_cmd=([]);
641 int cmd_man(string cmd, string args)
643 string filename = "server/net/manpages/" + args + ".man";
644 if(Stdio.exist(filename))
646 write ("\n" + Stdio.read_file(filename) + "\n");
650 write("There is no command \"" + args + "\"\n");
651 write("usage : man <command>\n");
657 int cmd_help(string cmd, string args)
659 send_message("\nthe following commands are available:\n%s\n",
660 sort(indices(run_commands))*" ");