/* ** Message */ #include "include/config.h" #include #include #include #include "include/mui.h" #include #include #include "include/gui.h" #include "include/napster.h" #include "include/msg.h" #include "amster_Cat.h" #include "include/protos.h" ULONG msg_new(struct IClass *cl, Object *obj, struct opSet *msg); void msg_say(struct msgdata *data); void msg_whois(struct msgdata *data, char *info); void msg_whowas(struct msgdata *data, char *user, char *level, u_long lastseen); char *msg_make(int d, char *nick, char *msg); MUIF msg_dispatch(REG(a0) struct IClass *cl,REG(a2) Object *obj,REG(a1) Msg msg) { struct msgdata *data = INST_DATA(cl,obj); switch(msg->MethodID) { case OM_NEW: return(msg_new(cl,obj,(APTR)msg)); case MSG_OPEN: set(obj,MUIA_Window_Open,TRUE); return(NULL); case MSG_GOT: { struct msgdata *data = INST_DATA(cl,obj); long winopen; get(obj, MUIA_Window_Open, &winopen); if (!winopen) set(obj, MUIA_Window_Open, TRUE); DoMethod(data->msglist,MUIM_NList_InsertSingle,(char*)((muimsg)msg)->arg1,MUIV_NList_Insert_Bottom); set(data->msglist,MUIA_NList_First,MUIV_NList_Active_Bottom); return(NULL); } case MSG_SAY: msg_say(data); return(NULL); case MSG_WHOIS: msg_whois(data, (char *)(((muimsg)msg)->arg1)); return(NULL); case MSG_WHOWAS: msg_whowas(data, (char *)(((muimsg)msg)->arg1), (char *)(((muimsg)msg)->arg2), (u_long)(((muimsg)msg)->arg3)); return(NULL); } return(DoSuperMethodA(cl,obj,msg)); } ULONG msg_new(struct IClass *cl, Object *obj, struct opSet *msg) { struct msgdata *data; Object *msglist,*msgstr; if (obj = (Object *)DoSuperNew(cl, obj, MUIA_HelpNode, "messenger", WindowContents, VGroup, Child, NListviewObject, MUIA_NListview_NList, msglist = NListObject, ReadListFrame, MUIA_NList_Input, FALSE, MUIA_NList_DefaultObjectOnClick, FALSE, MUIA_NList_ConstructHook, MUIV_NList_ConstructHook_String, MUIA_NList_DestructHook, MUIV_NList_DestructHook_String, MUIA_NList_Format, "", MUIA_NList_AutoCopyToClip, TRUE, MUIA_NList_TypeSelect, MUIV_NList_TypeSelect_Char, MUIA_NList_AutoVisible, TRUE, End, End, Child, msgstr = StringObject, StringFrame, MUIA_CycleChain, 1, MUIA_String_MaxLen, 256, End, End, TAG_MORE, msg->ops_AttrList)) { data = INST_DATA(cl,obj); data->msglist = msglist; data->msgstr = msgstr; set(obj,MUIA_Window_ID,MAKE_ID('M','E','S','G')); set(obj,MUIA_Window_Title,MSG_USER_TITLE), DoMethod(msgstr,MUIM_Notify,MUIA_String_Acknowledge,MUIV_EveryTime,obj,1,MSG_SAY); DoMethod(msgstr,MUIM_Notify,MUIA_String_Acknowledge,MUIV_EveryTime,obj,3,MUIM_Set,MUIA_Window_ActiveObject,msgstr); DoMethod(msgstr,MUIM_Notify,MUIA_String_Acknowledge,MUIV_EveryTime,msgstr,3,MUIM_Set,MUIA_String_Contents,NULL); DoMethod(obj,MUIM_Notify,MUIA_Window_Activate,TRUE,obj,3,MUIM_Set,MUIA_Window_ActiveObject,msgstr); DoMethod(obj,MUIM_Notify,MUIA_Window_CloseRequest,TRUE,obj,3,MUIM_Set,MUIA_Window_Open,FALSE); return((ULONG)obj); } return(0); } void msg_say(struct msgdata *data) { u_long tmp; char *cmd,*args; if(!gui_napon) { DoMethod(data->msglist,MUIM_NList_InsertSingle,msg_make(2,NULL,(char *)MSG_USER_NOTCONN),MUIV_NList_Insert_Bottom); set(data->msglist,MUIA_NList_First,MUIV_NList_Active_Bottom); return; } GetAttr(MUIA_String_Acknowledge,data->msgstr,&tmp); cmd = strtok((char*)tmp," "); args = strtok(NULL,""); if(!cmd) return; if(stricmp(cmd,"/whois")==0) nap_sendbuf(NAPC_WHOIS,args); else { sprintf(nap_buf,"%s %s",cmd,args); nap_send(NAPC_PRIVATEMSG); DoMethod(data->msglist,MUIM_NList_InsertSingle,msg_make(1,cmd,args),MUIV_NList_Insert_Bottom); set(data->msglist,MUIA_NList_First,MUIV_NList_Active_Bottom); } } void msg_whois(struct msgdata *data, char *info) { char buf[1024]; char *nick, *level, *channels, *status, *client; int time, shared, downloads, uploads, link; nick = nap_token(&info); level = nap_token(&info); time = nap_ltoken(&info); channels = nap_token(&info); status = nap_token(&info); shared = nap_itoken(&info); downloads = nap_itoken(&info); uploads = nap_itoken(&info); link = nap_itoken(&info); client = nap_token(&info); sprintf(buf, "\33bUser: %s (level: %s) - online: %d:%02d:%02d (%s)", nick, level, time/360, (time/60)%60, time%60, status); DoMethod(data->msglist, MUIM_NList_InsertSingle, buf, MUIV_NList_Insert_Bottom); if (channels != NULL) { sprintf(buf, "\33bChannels: %s", channels); DoMethod(data->msglist, MUIM_NList_InsertSingle, buf, MUIV_NList_Insert_Bottom); } sprintf(buf, "\33bShares: %d, downloads: %d, uploads: %d", shared, downloads, uploads); DoMethod(data->msglist, MUIM_NList_InsertSingle, buf, MUIV_NList_Insert_Bottom); sprintf(buf, "\33bClient: %s, link: %s", client, nap_linktype[link]); DoMethod(data->msglist, MUIM_NList_InsertSingle, buf, MUIV_NList_Insert_Bottom); set(data->msglist, MUIA_NList_First, MUIV_NList_Active_Bottom); } void msg_whowas(struct msgdata *data, char *user, char *level, u_long lastseen) { struct ClockData *cd; char buf[1024]; lastseen -= (8*365+2)*24*60*60; /* Number of seconds between January 1st/0:00, 1970 and January 1st/0:00, 1978 */ if (cd = malloc(sizeof(struct ClockData))) { Amiga2Date(lastseen, cd); sprintf(buf, "\33bUser: %s (level: %s) - last seen: %02d/%02d/%d %02d:%02d:%02d", user, level, cd->month, cd->mday, cd->year, cd->hour, cd->min, cd->sec); free(cd); DoMethod(data->msglist, MUIM_NList_InsertSingle, buf, MUIV_NList_Insert_Bottom); } else gui_debug("Out of memory: msg_whowas()"); } void msg_got(char *nick, char *msg) { char *tmp; tmp = msg_make(0,nick,msg); if(tmp) DoMethod(gui->mwin,MSG_GOT,tmp); } void msg_gotwhois(char *buf) { DoMethod(gui->mwin, MSG_WHOIS, buf); } char *msg_make(int d, char *nick, char *msg) { static char buf[1024]; if(d==0) sprintf(buf,"<%s> \33b%s",nick,msg); else if(d==1) sprintf(buf,"<%s> \33i%s",nick,msg); else if(d==2) sprintf(buf,"* %s",msg); return(buf); }