/*

     [DSKEL-MSg v1.0] MS [Generic]           By The Skeleton [08-01-92]
     |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~|
     | NODE | LOGON | HANDLE                    | ACTiViTY            |
     |======|=======|===========================|=====================|
     |   1  | 17:45 | The Skeleton              | Downloading         |
     |------|-------|---------------------------|---------------------|
     |   2  | --:-- | Awaiting a call           | Idle                |
     |------|-------|---------------------------|---------------------|
     |   3  | --:-- | Awaiting a call           | Idle                |
     |----------------------------------------------------------------|
     | Select node number you want to chat with.                      |
     `----------------------------------------------------------------'
      [Return = Quit] Select:

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

#include <proto/all.h>
#include <stdio.h>

#include <string.h>
#include <tempest/headers.h>

//********************************
//*****  Structures/Defines  *****
//********************************

struct MyMessage
 {
  struct Message Msg;
  struct User User;
  char text[255],
       text1[255];
  int car,Value,Data;
  long LongValue;
  int  IntValue;
 };

struct User User;
struct MsgPort *MyPort = NULL;
struct MyMessage *msg;
struct node_info nody;

#define DROP if(EXIT_FLAG) CloseStuff();

void CloseStuff(void);
void core(void);
int  DOORIO(void);
void Editor(char *,int);
void input(char mstring[],int len);
void pl(char outstring[]);
void sendtext(BYTE);
void WriteFile(char ostring[],char mstring[]);
void ListNodes(void);
int Loadnody(int node);
void Activity(BYTE ,char *);

//*******************************
//*****  Global Variables  ******
//*******************************

int  NODE,R_NODE,NODES;
int  EXIT_FLAG, DOOR_DATA, DOOR_CAR, DOOR_VALUE, DOOR_VALUE1 = 0,
     Result,Error,first = 0;
char MyName[255],st[100],DOOR_MSG[255],DOOR_MSG1[255],nodename[255];

//******************
//*****  Main  *****
//******************

void main(int argc,char *argv[])
{
 int stat;
 if(!DoorStart(argv[1])) { PutStr("[os2] Tempest Door\n"); exit(0); }

//********************************
//*****  Load Internal.Data  *****
//********************************

 if((!User.NFlags1 & NF1_InternodeMsgSend)||(!User.NFlags1 & NF1_ViewNodeLists))
     CloseStuff();

 Activity(31,"");

 NODE = atoi(argv[1]);
 stat=Loadnody(NODE);
 if(stat==0)
  {
   pl("NodeInfo File Not Found!\r\n");
   CloseStuff();
  }
 NODES = nody.SystemDataInfo->NumberOfLines + 1;
 core();
 CloseStuff();
}
//******************
//*****  Core  *****
//******************

void core(void)
{
 char string[60];
 register int x;
 int stat;
 while(1)
  {
   REDO:
   pl("\r\n [33m[[0mReturn=Quit[33m] [L=List Nodes[33m] [[0mA=All Nodes[33m]\r\n");
   pl(" [36mSelect Node Number you want to send msg to[0m: ");
   input(string,2);
   DROP;
   if(string[0]==NULL) break;
   string[0]=toupper(string[0]);
   if((string[0]=='N')||(string[0]=='Q')) break;
   R_NODE = 0;
   if((string[0]=='?')||(string[0]=='L'))
    {
     ListNodes();
     goto REDO;
    }
   if(string[0]=='A')
    {
     stat=0;
     for(x=1;x<NODES;x++) if((nody.UserInfo->Name[0]!=NULL)&&(x!=NODE)) stat++;
     if(stat>0)
      {
       sprintf(string,"node:work_ed-A",NODE);
       Editor(string,100);
       for(x=1;x<NODES;x++)
        {
         if(x != NODE)
          {
           stat=Loadnody(x);
           if((nody.UserInfo->Name[0]!=NULL)&&(stat!=0))
            {
             if((*nody.AN!=58)&&(*nody.AN!=56)&&(*nody.AN!=4))
              {
               R_NODE = x;
               if(access(string,0)==0) sendtext(1);
              }
            }
          }
        }
       DeleteFile(string);
      }
     else pl("\r\n[33mNobody online to send a msg to!\r\n\r\n");
    }
   x = atoi(string);
   if((x==NODE)||(x==0)) goto REDO;
   stat=Loadnody(x);
   if((nody.UserInfo->Name[0]!=NULL)&&(stat!=0))
    {
     if(nody.UserInfo->NFlags1 & NF1_RecieveNodeMsgs)
      {
       if((*nody.AN!=58)&&(*nody.AN!=56)&&(*nody.AN!=4))
        {
         R_NODE = x;
         sprintf(string,"node:work_ed-%d",NODE);
         Editor(string,100);
         if(access(string,0)==0)
            sendtext(0);
        }
       else pl("\r\n[33mYou can not send a msg to that user at this time!\r\n\r\n");
      }
     else pl("\r\nSorry, that user is not allowed to receive internode msgs!\r\n\r\n");
    }
   else pl("\r\nNobody on that node!\r\n");
  }
}

//************************
//*****  Load Nody  ******
//************************

int Loadnody(int node)
{
 char string[50];
 register int y;
 int file;
 sprintf(string,"Node:NodeInfo_%d",node);
 for(y=1;y<3;y++)
  {
   file=Open(string,MODE_OLDFILE);
   if(file!=0)
    {
     Read(file,(char *)&nody,sizeof(struct node_info));
     Close(file);
     return(1);
    }
  }
 return(0);
}

//*************************
//*****  List Nodes  ******
//*************************

void ListNodes(void)
{
 char string[200],string2[20];
 char Handle[40],Activity[30],Time[15];
 int stat;
 register int i;

 pl("\r\n[33m[[0mInternode Msg Sender Module v2.0[33m]   [0mBy Michael Bockert [33m[[0m03-20-94[33m]\r\n");
 pl("[32m|~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~|[0m\r\n");
 pl("[32m| [33mNoDE [32m| [33mLoGoN [32m| [33mHANDLE                    [32m| [33mACTiViTY            [32m|\r\n");

 i=1;
 do
  {
   if(CTRLC())
    {
     pl("[31mAborting Who Display![0m\r\n");
     return;
    }
   stat=Loadnody(i);
   if(stat==0) setmem(&nody,sizeof(struct node_info),NULL);
   strcpy(Handle,nody.UserInfo->Name);
   if((*nody.hide==1)&&(User.Security!=255)&&(User.Name[0]!=NULL))
    {
     if(nody.UserInfo->Slot_Number==1) Handle[0]=NULL;
     else strcpy(Handle,"[ Hiding From Display ]");
    }
   if(Handle[0]!=NULL)
    {
     sprintf(string,"%s",ctime(&nody.UserInfo->Time_Last_Connect));
     strmid(string,Time,12,5);
     strcpy(Activity,nody.activity);

     sprintf(string,"NODE:CHAT-%d",i);
     if(access(string,0)==0) strcpy(Activity,"Chat System");
     //***************************
     //*****  Final Output  ******
     //***************************
     pl("|------|-------|---------------------------|---------------------|\r\n");
//     if(nody.NodeDataInfo->LocalMode==0)
     sprintf(string2,"%2d",i);
//     else                                strcpy(string2," V");
     sprintf(string,"|  [36m%2s  [32m| [31m%5s [32m| [0m%-25.25s [32m| [0m%-19s [32m|\r\n",
             string2,Time,Handle,Activity);
     pl(string);
    }
   i++;
  }
 while(i<NODES);
 pl("`----------------------------------------------------------------'\r\n");
}

//***********************
//*****  Send Text  *****
//***********************

void sendtext(TYPE) // 0 = single, 1 = All
BYTE TYPE;
{
 char string[300],shit[100];
 char begin[60],middle[60],end[60],send[60];

 sprintf(begin,"node:work1-%d",NODE);
 if(TYPE) sprintf(middle,"node:work_ed-A",NODE);
 else     sprintf(middle,"node:work_ed-%d",NODE);
 sprintf(end,  "node:work2-%d",NODE);
 sprintf(send, "node:MsgToNode-%d",R_NODE);
 strcpy(shit,"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n");

 sprintf(string,"\r\n\r\n[37mInternode Message[0m Sent by [35m%s[0m on Node #%d\n%s",User.Name,NODE,shit);
 WriteFile(begin,string);

 sprintf(string,"%s[0m* END OF MSG *\n",shit);
 WriteFile(end,string);

 sprintf(string,"Join >nil: %s %s %s as %s",begin,middle,end,send);
 Execute(string,0L,0L);

 DeleteFile(begin);
 if(!TYPE) DeleteFile(middle);
 DeleteFile(end);
}








//*************************
//*****  Close Stuff  *****
//*************************

void CloseStuff(void)
{ DOOR_DATA=99; strcpy(DOOR_MSG,'\0'); DOORIO();
 while(msg=(struct MyMessage *)GetMsg(MyPort)) ReplyMsg((struct Message *)msg);
 if(MyPort) DeletePort(MyPort);
 exit(0); }

//********************
//*****  DoorIO  *****
//********************

int DOORIO(void)
{
 struct MsgPort *HisPort;
 struct MyMessage message;
 int UPDATE;
 if(EXIT_FLAG) return 0;
 UPDATE=0;
 HisPort = FindPort(st);
 if(HisPort!=NULL)
  {
   message.Msg.mn_Node.ln_Type = NT_MESSAGE;
   message.Msg.mn_Length = sizeof(message);
   message.Msg.mn_ReplyPort = MyPort;
   if(first)CopyMem(&User,&message.User,sizeof(struct User));
   message.car   = 0;
   message.Data  = DOOR_DATA;
   message.Value = DOOR_VALUE;
   message.IntValue = DOOR_VALUE1;
   strcpy(message.text,DOOR_MSG);
   strcpy(message.text1,DOOR_MSG1);
   PutMsg((struct MsgPort *)HisPort,(struct Message *)&message);
   Wait(1 << MyPort->mp_SigBit);
   GetMsg(MyPort);
   DOOR_DATA  = message.Data;
   DOOR_VALUE = message.Value;
   DOOR_VALUE1 = message.IntValue;
   strcpy(DOOR_MSG,message.text);
   strcpy(DOOR_MSG1,message.text1);
   CopyMem(&message.User,&User,sizeof(struct User));
   first=1;
   UPDATE=0;
   if(message.car) EXIT_FLAG=1;
  }
 return 0;
}

//************************
//*****  Door Start  *****
//************************

DoorStart(char node[])
{
 struct MsgPort *HisPort;
 EXIT_FLAG = 0;
 sprintf(st,"%s:TEMPEST_DOOR",node);
 HisPort = FindPort(st);
 if(HisPort==NULL) return (FALSE);
 sprintf(MyName,"%s:DOOR_PORT",node);
 MyPort = CreatePort(MyName,0L);
 if(MyPort==NULL)
  {
   PutStr("Cant open port");
   return(int)FALSE;
  }
 DOORIO();
 return (int)TRUE;
}

 //**********************
 //*****  Activity  *****
 //**********************

 void Activity(BYTE act,char *text)
 { DOOR_DATA=72; DOOR_VALUE=act; strcpy(DOOR_MSG,text); DOORIO(); }

//********************
//*****  Editor  *****
//********************

void Editor(char Filename[],int value)
{ DOOR_DATA=29; DOOR_VALUE=value; strcpy(DOOR_MSG,Filename); DOORIO(); }

//*******************
//*****  Input  *****
//*******************

void input(char mstring[],int len)
{ DOOR_DATA=40; DOOR_VALUE=len; strcpy(DOOR_MSG,mstring); DOORIO();
 strcpy(mstring,DOOR_MSG); strcpy(DOOR_MSG,'\0'); strcpy(DOOR_MSG1,'\0'); }

//*****************************
//*****  PL (Print Line)  *****
//*****************************

void pl(char outstring[])
{ DOOR_DATA=1; strcpy(DOOR_MSG,outstring); DOORIO(); }

//************************
//*****  Write File  *****
//************************

void WriteFile(char ostring[],char mstring[])
{ DOOR_DATA=16; strcpy(DOOR_MSG,ostring); strcpy(DOOR_MSG1,mstring); DOORIO();
  strcpy(DOOR_MSG,'\0'); strcpy(DOOR_MSG1,'\0'); }

//*************************
//*****  CTRLC CHECK  *****
//*************************

int CTRLC(void)
 {
  DOOR_DATA=73;
  DOORIO();
  return(DOOR_VALUE);
 }
