#include <living/comm.h>

// Eine grundlegende Struct fuer Nachrichten an Livings, welche alle
// Programme benutzen koennen.
public struct wave_s
{
  string msg;
  int    type;
  string prefix;
};

// Sendet an alle Objekte in room und room selber durch Aufruf von
// ReceiveMsg().
varargs void send_room(object|string room, string msg, int msg_type,
                       string msg_action, string msg_prefix, object *exclude,
                       object origin=previous_object())
{
  if (stringp(room))
    room=load_object(room);

  // Keine Ausgabe im Netztotenraum. Die Anwesenden fangen damit sowieso
  // nichts an und aufgrund der aufwaendigen Checks besteht die Gefahr, dass
  // die Ticks ausgehen.
  if(object_name(room) == "/room/netztot") return;

  object *dest = exclude ? all_inventory(room) - exclude :
                           all_inventory(room);

  dest->ReceiveMsg(msg, msg_type, msg_action, msg_prefix, origin);
}

varargs void send_debug(object|string wiz, string msg, string msg_prefix)
{
  if (stringp(wiz))
    wiz=find_player(wiz);
  // Mit Absicht hier keine Pruefung auf Magierstatus. Das macht ReceiveMsg.
  // Und: so ist die Moeglichkeit gegeben, Testspieler so einzustellen, dass
  // sie die Debugmeldungen erhalten.
  if (objectp(wiz))
      wiz->ReceiveMsg(msg, MT_DEBUG|MSG_BS_LEAVE_LFS|MSG_DONT_STORE,
                      0, msg_prefix, previous_object());
}

static int _shout_filter( object ob, string pat )
{
    if ( !environment(ob) )
       return 0;

    return sizeof( regexp( ({ object_name( environment(ob) ) }), pat ) );
}

varargs void shout( string s, mixed where ){
    object *u;
    string *pfade;

    if ( !sizeof( u = users() - ({ this_player() }) ) )
       return;

    if ( !where )
       pfade = ({ "/" });
    else if ( intp(where) )
       pfade =
           ({ implode( efun::explode( object_name( environment(this_player()) ),
                                   "/" )[0..2], "/" ) + "/" });
    else if ( stringp(where) )
       pfade = ({ where });
    else
       pfade = where;

    u = filter( u, "_shout_filter", ME, implode( pfade, "|" ) );
    u->ReceiveMsg(s, MT_COMM|MT_FAR|MSG_DONT_WRAP|MSG_DONT_STORE,
                  MA_SHOUT_SEFUN, 0, previous_object());
}


#if __VERSION__ > "3.3.718"
// This sefun replaces the deprecated efun cat().
#define CAT_MAX_LINES 50
varargs int cat(string file, int start, int num)
{
    if (extern_call())
        set_this_object(previous_object());

    int more;

    if (num < 0 || !this_player())
        return 0;

    if (!start)
        start = 1;

    if (!num || num > CAT_MAX_LINES) {
        num = CAT_MAX_LINES;
        more = sizeof(read_file(file, start+num, 1));
    }

    string txt = read_file(file, start, num);
    if (!txt)
        return 0;

    efun::tell_object(this_player(), txt);

    if (more)
        efun::tell_object(this_player(), "*****TRUNCATED****\n");

    return sizeof(txt & "\n");
}
#undef CAT_MAX_LINES
#endif // __VERSION__ > "3.3.718"

#if __VERSION__ > "3.3.719"
// This sefun replaces the deprecated efun tail().
#define TAIL_MAX_BYTES 1000
varargs int tail(string file)
{
    if (extern_call())
        set_this_object(previous_object());

    if (!stringp(file) || !this_player())
        return 0;

    bytes bs = read_bytes(file, -(TAIL_MAX_BYTES + 80),
                          (TAIL_MAX_BYTES + 80));
    // read_bytes() returns 0 if the start of the section given by
    // parameter #2 lies before the beginning of the file.
    // In this case we simply try and read the entire file.
    if (!bytesp(bs) && file_size(file) < TAIL_MAX_BYTES+80)
      bs = read_bytes(file, 0, (TAIL_MAX_BYTES + 80));
    // Exit if still nothing could be read.
    if (!bytesp(bs))
      return 0;

    // convert to string
    string txt = to_text(bs, "UTF-8");

    // cut off first (incomplete) line
    int index = strstr(txt, "\n");
    if (index > -1) {
        if (index + 1 < sizeof(txt))
            txt = txt[index+1..];
        else
            txt = "";
    }

    efun::tell_object(this_player(), txt);

    return 1;
}
#undef TAIL_MAX_BYTES
#endif // __VERSION__ > "3.3.719"

