/* **** HBBS Door Code****************************************************** */

/*
  DoorName
  ========

    what the door does

  Version
  =======

    x.xx, release xx, dd/mm/yyyy

  Options
  =======

    N_ND->ActiveDoor->SystemOptions
    -------------------------------



    Command Line Arguments
    ----------------------

    2  <option>

    3  ...

    4  .

  ToDo
  ====

    what you still have to do



*/

/* **** Includes *********************************************************** */

#include <exec/types.h>
#include <exec/memory.h>
#include <dos/dos.h>
#include <clib/exec_protos.h>
#include <clib/dos_protos.h>
#include <clib/alib_protos.h>

#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include <ctype.h>
#include <time.h>

#include <HBBS/ANSI_Codes.h>
#include <HBBS/Defines.h>
#include <HBBS/Access.h>
#include <HBBS/types.h>
#include <HBBS/structures.h>
#include <HBBS/hbbscommon_protos.h>
#include <HBBS/hbbscommon_pragmas.h>
#include <HBBS/Hbbsnode_protos.h>
#include <HBBS/Hbbsnode_pragmas.h>
#include <HBBS/release.h>
char *versionstr="$VER: Announce "RELEASE_STR;

/* **** Variables ********************************************************** */


struct Library *HBBSCommonBase  = NULL;
struct Library *HBBSNodeBase    = NULL;

struct BBSGlobalData *BBSGlobal = NULL;
struct NodeData *N_ND           = NULL;
int    N_NodeNum                = -1;
char   outstr[1024];

long __stack=16*1024; // increse this in 4k incrments if you suffer from
                      // random/suprious crashings after or during the running
                      // of your door.

int    gargc;         // these are just copies of main()'s argc and argv..
char   **gargv;

/* **** Functions ********************************************************** */


#ifdef __SASC
int CXBRK(void) { return(0); }
int _CXBRK(void) { return(0); }
void chkabort(void) {}
#endif

static VOID cleanup(ULONG num)
{
  if (HBBSNodeBase)
  {
    HBBS_CleanUpDoor();
    CloseLibrary (HBBSNodeBase);
  }

  if (HBBSCommonBase)
  {
    HBBS_CleanUpCommon();
    CloseLibrary (HBBSCommonBase);
  }

  if (num) printf("Door Error = %d\n",num);

  exit(0);
}

static VOID init(char *name)
{
  if(!(HBBSCommonBase = OpenLibrary("HBBSCommon.library",0)))
  {
    cleanup(1);
  }

  if (!(HBBS_InitCommon()))
  {
    cleanup(2);
  }

  if(!(HBBSNodeBase = OpenLibrary("HBBSNode.library",0)))
  {
    cleanup(3);
  }

  if (!(HBBS_InitDoor(N_NodeNum,name)))
  {
    cleanup(4);
  }
  SetProgramName(name);
}

/* **** DoorMain *********************************************************** */

void DoorMain( void )
{
  LONG loop;
  struct NodeData *nd;
  BOOL Sent;
  outstr[0]=0;

  if (gargc==3)
  {
    DOOR_SysopText("Announcement: ");
    for (loop=0;loop<BBSGlobal->BBSNodes;loop++)
    {
      Sent=FALSE;
      if (loop!=N_ND->NodeNum) // don't send to our own node!
      {
        if (nd=HBBS_NodeDataPtr(loop))
        {
          sprintf(outstr,"%s just logged %s node %ld",N_ND->User->CallData->Handle,gargv[2],N_ND->NodeNum);

          // if user has logged on the uer might want to say hi via an olm
          // but there's no point letting the user reply to an olm that says
          // the user has just logged off! :-)
          if (HBBS_SendOLM((stricmp(gargv[2],"ON")==0) ? N_ND->NodeNum+1 : 0,"Announce",loop,outstr,1)) // set pri just above normal OLM's
          {
            Sent=TRUE;
            sprintf(outstr,"%s%ld "ANSI_FG_BLUE"- "ANSI_FG_YELLOW"YES"ANSI_FG_WHITE,loop >0 ? ", " : "",loop);
            DOOR_SysopText(outstr);
          }
        }
      }
      if (!Sent)
      {
        sprintf(outstr,"%s%ld "ANSI_FG_BLUE"- "ANSI_FG_GREEN"NO"ANSI_FG_WHITE,loop >0 ? ", " : "",loop);
        DOOR_SysopText(outstr);
      }
    }
    DOOR_SysopText("\r\n");
  }
  else
  {
    DOOR_WriteText("Invalid Parameters! usage: Announce [on|off]\r\n");
  }
}


int main(int argc,char **argv)
{
  gargc=argc;
  gargv=argv;

  if (sscanf(argv[1],"%d",&N_NodeNum)==0)
  {
    printf("Invalid/No Paramaters for door!\n");
    exit (20);
  }
  init("Writing OLM");

  if (BBSGlobal=HBBS_GimmeBBS())
  {
    if (N_ND=HBBS_NodeDataPtr(N_NodeNum)) // this should not fail in normal circumstances..
    {
      DoorMain();
    }
  }
  cleanup(0);
}

/* **** End Of File ******************************************************** */
