tmi2_fluffos_v2/
tmi2_fluffos_v2/bin/
tmi2_fluffos_v2/etc/
tmi2_fluffos_v2/fluffos-2.7-ds2.018/
tmi2_fluffos_v2/fluffos-2.7-ds2.018/ChangeLog.old/
tmi2_fluffos_v2/fluffos-2.7-ds2.018/Win32/
tmi2_fluffos_v2/fluffos-2.7-ds2.018/compat/
tmi2_fluffos_v2/fluffos-2.7-ds2.018/compat/simuls/
tmi2_fluffos_v2/fluffos-2.7-ds2.018/include/
tmi2_fluffos_v2/fluffos-2.7-ds2.018/testsuite/
tmi2_fluffos_v2/fluffos-2.7-ds2.018/testsuite/clone/
tmi2_fluffos_v2/fluffos-2.7-ds2.018/testsuite/command/
tmi2_fluffos_v2/fluffos-2.7-ds2.018/testsuite/data/
tmi2_fluffos_v2/fluffos-2.7-ds2.018/testsuite/etc/
tmi2_fluffos_v2/fluffos-2.7-ds2.018/testsuite/include/
tmi2_fluffos_v2/fluffos-2.7-ds2.018/testsuite/inherit/
tmi2_fluffos_v2/fluffos-2.7-ds2.018/testsuite/inherit/master/
tmi2_fluffos_v2/fluffos-2.7-ds2.018/testsuite/log/
tmi2_fluffos_v2/fluffos-2.7-ds2.018/testsuite/single/
tmi2_fluffos_v2/fluffos-2.7-ds2.018/testsuite/single/tests/compiler/
tmi2_fluffos_v2/fluffos-2.7-ds2.018/testsuite/single/tests/efuns/
tmi2_fluffos_v2/fluffos-2.7-ds2.018/testsuite/single/tests/operators/
tmi2_fluffos_v2/fluffos-2.7-ds2.018/testsuite/u/
tmi2_fluffos_v2/fluffos-2.7-ds2.018/tmp/
tmi2_fluffos_v2/fluffos-2.7-ds2.018/windows/
tmi2_fluffos_v2/lib/
tmi2_fluffos_v2/lib/adm/
tmi2_fluffos_v2/lib/adm/daemons/languages/
tmi2_fluffos_v2/lib/adm/daemons/network/I3/
tmi2_fluffos_v2/lib/adm/daemons/virtual/
tmi2_fluffos_v2/lib/adm/daemons/virtual/template/
tmi2_fluffos_v2/lib/adm/news/
tmi2_fluffos_v2/lib/adm/obj/
tmi2_fluffos_v2/lib/adm/obj/master/
tmi2_fluffos_v2/lib/adm/priv/
tmi2_fluffos_v2/lib/adm/shell/
tmi2_fluffos_v2/lib/adm/tmp/
tmi2_fluffos_v2/lib/cmds/
tmi2_fluffos_v2/lib/d/
tmi2_fluffos_v2/lib/d/Conf/
tmi2_fluffos_v2/lib/d/Conf/adm/
tmi2_fluffos_v2/lib/d/Conf/boards/
tmi2_fluffos_v2/lib/d/Conf/cmds/
tmi2_fluffos_v2/lib/d/Conf/data/
tmi2_fluffos_v2/lib/d/Conf/logs/
tmi2_fluffos_v2/lib/d/Conf/obj/
tmi2_fluffos_v2/lib/d/Conf/text/help/
tmi2_fluffos_v2/lib/d/Fooland/adm/
tmi2_fluffos_v2/lib/d/Fooland/data/
tmi2_fluffos_v2/lib/d/Fooland/data/attic/
tmi2_fluffos_v2/lib/d/Fooland/items/
tmi2_fluffos_v2/lib/d/TMI/
tmi2_fluffos_v2/lib/d/TMI/adm/
tmi2_fluffos_v2/lib/d/TMI/boards/
tmi2_fluffos_v2/lib/d/TMI/data/
tmi2_fluffos_v2/lib/d/TMI/rooms/
tmi2_fluffos_v2/lib/d/grid/
tmi2_fluffos_v2/lib/d/grid/adm/
tmi2_fluffos_v2/lib/d/grid/data/
tmi2_fluffos_v2/lib/d/std/
tmi2_fluffos_v2/lib/d/std/adm/
tmi2_fluffos_v2/lib/data/adm/
tmi2_fluffos_v2/lib/data/adm/daemons/
tmi2_fluffos_v2/lib/data/adm/daemons/doc_d/
tmi2_fluffos_v2/lib/data/adm/daemons/emoted/
tmi2_fluffos_v2/lib/data/adm/daemons/network/http/
tmi2_fluffos_v2/lib/data/adm/daemons/network/services/mail_q/
tmi2_fluffos_v2/lib/data/adm/daemons/network/smtp/
tmi2_fluffos_v2/lib/data/adm/daemons/news/archives/
tmi2_fluffos_v2/lib/data/attic/connection/
tmi2_fluffos_v2/lib/data/attic/user/
tmi2_fluffos_v2/lib/data/std/connection/b/
tmi2_fluffos_v2/lib/data/std/connection/l/
tmi2_fluffos_v2/lib/data/std/user/a/
tmi2_fluffos_v2/lib/data/std/user/b/
tmi2_fluffos_v2/lib/data/std/user/d/
tmi2_fluffos_v2/lib/data/std/user/f/
tmi2_fluffos_v2/lib/data/std/user/l/
tmi2_fluffos_v2/lib/data/std/user/x/
tmi2_fluffos_v2/lib/data/u/d/dm/working/doc_d/
tmi2_fluffos_v2/lib/data/u/l/leto/doc_d/
tmi2_fluffos_v2/lib/data/u/l/leto/smtp/
tmi2_fluffos_v2/lib/doc/
tmi2_fluffos_v2/lib/doc/driverdoc/applies/
tmi2_fluffos_v2/lib/doc/driverdoc/applies/interactive/
tmi2_fluffos_v2/lib/doc/driverdoc/concepts/
tmi2_fluffos_v2/lib/doc/driverdoc/driver/
tmi2_fluffos_v2/lib/doc/driverdoc/efuns/arrays/
tmi2_fluffos_v2/lib/doc/driverdoc/efuns/buffers/
tmi2_fluffos_v2/lib/doc/driverdoc/efuns/compile/
tmi2_fluffos_v2/lib/doc/driverdoc/efuns/ed/
tmi2_fluffos_v2/lib/doc/driverdoc/efuns/filesystem/
tmi2_fluffos_v2/lib/doc/driverdoc/efuns/floats/
tmi2_fluffos_v2/lib/doc/driverdoc/efuns/functions/
tmi2_fluffos_v2/lib/doc/driverdoc/efuns/general/
tmi2_fluffos_v2/lib/doc/driverdoc/efuns/mappings/
tmi2_fluffos_v2/lib/doc/driverdoc/efuns/numbers/
tmi2_fluffos_v2/lib/doc/driverdoc/efuns/parsing/
tmi2_fluffos_v2/lib/doc/driverdoc/lpc/constructs/
tmi2_fluffos_v2/lib/doc/driverdoc/lpc/preprocessor/
tmi2_fluffos_v2/lib/doc/driverdoc/lpc/types/
tmi2_fluffos_v2/lib/doc/driverdoc/platforms/
tmi2_fluffos_v2/lib/doc/mudlib/
tmi2_fluffos_v2/lib/ftp/
tmi2_fluffos_v2/lib/include/driver/
tmi2_fluffos_v2/lib/log/
tmi2_fluffos_v2/lib/log/driver/
tmi2_fluffos_v2/lib/obj/net/
tmi2_fluffos_v2/lib/obj/shells/
tmi2_fluffos_v2/lib/obj/tools/
tmi2_fluffos_v2/lib/std/adt/
tmi2_fluffos_v2/lib/std/board/
tmi2_fluffos_v2/lib/std/body/
tmi2_fluffos_v2/lib/std/fun/
tmi2_fluffos_v2/lib/std/living/
tmi2_fluffos_v2/lib/std/object/
tmi2_fluffos_v2/lib/std/shop/
tmi2_fluffos_v2/lib/std/socket/
tmi2_fluffos_v2/lib/std/user/
tmi2_fluffos_v2/lib/std/virtual/
tmi2_fluffos_v2/lib/student/
tmi2_fluffos_v2/lib/student/kalypso/
tmi2_fluffos_v2/lib/student/kalypso/armor/
tmi2_fluffos_v2/lib/student/kalypso/rooms/
tmi2_fluffos_v2/lib/student/kalypso/weapons/
tmi2_fluffos_v2/lib/u/l/leto/
tmi2_fluffos_v2/lib/u/l/leto/cmds/
tmi2_fluffos_v2/lib/www/errors/
tmi2_fluffos_v2/lib/www/gateways/
tmi2_fluffos_v2/lib/www/images/
tmi2_fluffos_v2/old/
tmi2_fluffos_v2/win32/
#define WHO find_player("pallando")
#define DEBUG(X) if(WHO) tell_object( WHO, wrap(X) )
#define DDBUG(X) DEBUG("X == "+identify(X))
/*
// File     :  /www/gateways/tell.c
// Desc     :  Allows mud users <--> web user communication
// 94-10-** :  Qualin@Crossed.Swords devised and wrote original code
//             ( Troels Therkelsen <mailto:troelst@diku.dk> )
// 94-11-12 :  Pallando adapted it for TMI-2 mudlibs
*/
#include <net/daemons.h>
#include <mudlib.h>

inherit DAEMON;

mapping msgs;

string rcve_mess(string me, string from);
string send_mess(string me, string to, string mess);
string repl_esc(string str);

string gateway( string input ) {
  string ret, *i;
  int s, c;
  
DDBUG(input);
  ret = "<h2>Response:</h2><p><hr><p>";
  input = repl_esc(input);
  i = explode(input, "&");
DDBUG(i);
  
  for (c = 0, s = sizeof(i); c < s; c++)
    if (i[c][<1] == '=')
      s = 0;
      
DDBUG(s);
  switch(s) {
    case 0:
      ret += "<h3>Error:</h3><p><i>You must fill out all required boxes!</i>";
      break;
    case 2:
      ret += rcve_mess(i[0], i[1]);
      break;
    case 3:
      ret += send_mess(i[0], i[1], i[2]);
      break;
  }
DDBUG(ret);
  return ret;
}

string send_mess(string me, string to, string mess) {
    object ob;
  me = me[5..<1];
  to = lower_case( to[5..<1] );
  mess = replace_string(mess, "+", " ");
  mess = replace_string(mess, "%0A", "\n");
  mess = mess[5..<1];

DDBUG(me); DDBUG(to); DDBUG(mess);
// I2:    return TS_D-> tell_user( me, "web", to, mess );
    ob = find_player(to);
    if (!ob)
        return (capitalize(to) + " not found online.\n");
    if (!interactive(ob))
        return (capitalize(to) + " is net dead.\n");
    if (ob->query("busy"))
        return (capitalize(to) + " is busy right now, please try again later...\n");

    message("tell", capitalize(me) + "@(web) tells you: " + mess + "\n", ob);

    return ("You tell " + ob->query("cap_name") + ": " + mess + "\n");
}

void add_message(string from, string to, string mess) {
  mess = sprintf("Message from %s MUD time %s: \"%s\".", 
		 capitalize(from), ctime(time()), mess);
  to = lower_case(to);

  if (!msgs)
    msgs = ([to: ({ ({from, mess}) })]);
  else if (undefinedp(msgs[to]))
    msgs += ([to: ({ ({from, mess}) })]);
  else
    msgs[to] += ({from, mess});
}

string rcve_mess(string me, string from) {
  int l, s;
  string mess;

  if (!msgs)
    msgs = ([]);
  me = lower_case(me[5..<1]);
  from = lower_case(from[5..<1]);

  if (undefinedp(msgs[me]))
    return "There are no pending messages for you.";

  for (l = 0, s = sizeof(msgs[me]); l < s; s++)
    if (msgs[me][l][0] == from) {
      mess = msgs[me][l][1];
      if (s == 1)
	map_delete(msgs, me);
      else if (!l)
	msgs[me] = msgs[me][1..s-1];
      else if (l = (s-1))
	msgs[me] = msgs[me][0..s-2];
      else
	msgs[me] = msgs[me][0..l-1]+msgs[me][l+1..s-1];
      return mess;
    }

  return "There are no pending messages from "+from+".";
}

string char(int c1, int c2) {
  c1 -= 48;
  c2 -= 48;
  if (c1 > 9)
    c1 -= 7;
  if (c2 > 9)
    c2 -= 7;

  return sprintf("%c", c1*16+c2);
}

/* This function replaces occurences of "%##" with the corresponding character.
   Might not work 100%. Might even be coded faster...*/
string repl_esc(string str) {
  int s, c;
  string ret;

  s = strlen(str);
  c = 0;
  ret = "";
  while (c < s) {
    if (str[c] == '%') {
      ret += char(str[c+1], str[c+2]);
      c += 3;
    }
    else {
      ret += str[c..c];
      c++;
    }
  }
  
  return ret;
}