⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 watch.c

📁 打魔兽战网的都知道他是什么
💻 C
字号:
/* * Copyright (C) 1999,2000  Ross Combs (rocombs@cs.nmsu.edu) * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA. */#define WATCH_INTERNAL_ACCESS#include "common/setup_before.h"#ifdef STDC_HEADERS# include <stdlib.h>#else# ifdef HAVE_MALLOC_H#  include <malloc.h># endif#endif#ifdef HAVE_STRING_H# include <string.h>#else# ifdef HAVE_STRINGS_H#  include <strings.h># endif# ifdef HAVE_MEMORY_H#  include <memory.h># endif#endif#include "compat/strcasecmp.h"#include "common/field_sizes.h"#include "common/list.h"#include "account.h"#include "connection.h"#include "common/eventlog.h"#include "message.h"#include "watch.h"#include "friends.h"#include "common/tag.h"#include "common/xalloc.h"#include "prefs.h"#include "common/setup_after.h"static t_list * watchlist_head=NULL;/* who == NULL means anybody */extern int watchlist_add_events(t_connection * owner, t_account * who, t_clienttag clienttag, t_watch_event events){    t_elem const * curr;    t_watch_pair * pair;        if (!owner)    {	eventlog(eventlog_level_error,__FUNCTION__,"got NULL owner");	return -1;    }    LIST_TRAVERSE_CONST(watchlist_head,curr)    {	pair = elem_get_data(curr);	if (!pair) /* should not happen */	{	    eventlog(eventlog_level_error,__FUNCTION__,"watchlist contains NULL item");	    return -1;	}	if (pair->owner==owner && pair->who==who && ((clienttag == pair->clienttag)))	{	    pair->what |= events;	    return 0;	}    }    pair = xmalloc(sizeof(t_watch_pair));    pair->owner = owner;    pair->who   = who;    pair->what  = events;    pair->clienttag = clienttag;        list_prepend_data(watchlist_head,pair);        return 0;}/* who == NULL means anybody */extern int watchlist_del_events(t_connection * owner, t_account * who, t_clienttag clienttag, t_watch_event events){    t_elem *       curr;    t_watch_pair * pair;        if (!owner)    {	eventlog(eventlog_level_error,__FUNCTION__,"got NULL owner");	return -1;    }        LIST_TRAVERSE(watchlist_head,curr)    {	pair = elem_get_data(curr);	if (!pair) /* should not happen */	{	    eventlog(eventlog_level_error,__FUNCTION__,"watchlist contains NULL item");	    return -1;	}	if (pair->owner==owner && pair->who==who && ((!clienttag) || (clienttag == pair->clienttag)))	{	    pair->what &= ~events;	    if (pair->what==0)	    {		if (list_remove_elem(watchlist_head,&curr)<0)		{		    eventlog(eventlog_level_error,__FUNCTION__,"could not remove item");		    pair->owner = NULL;		}		else		    xfree(pair);	    }	    	    return 0;	}    }        return -1; /* not found */}/* this differs from del_events because it doesn't return an error if nothing was found */extern int watchlist_del_all_events(t_connection * owner){    t_elem *       curr;    t_watch_pair * pair;        if (!owner)    {	eventlog(eventlog_level_error,__FUNCTION__,"got NULL owner");	return -1;    }        LIST_TRAVERSE(watchlist_head,curr)    {	pair = elem_get_data(curr);	if (!pair) /* should not happen */	{	    eventlog(eventlog_level_error,__FUNCTION__,"watchlist contains NULL item");	    return -1;	}	if (pair->owner==owner)	{	    if (list_remove_elem(watchlist_head,&curr)<0)	    {		eventlog(eventlog_level_error,__FUNCTION__,"could not remove item");		pair->owner = NULL;	    }	    else	      { xfree(pair); }	}    }        return 0;}/* this differs from del_events because it doesn't return an error if nothing was found */extern int watchlist_del_by_account(t_account * who){    t_elem *       curr;    t_watch_pair * pair;        if (!who)    {	eventlog(eventlog_level_error,__FUNCTION__,"got NULL account");	return -1;    }        LIST_TRAVERSE(watchlist_head,curr)    {	pair = elem_get_data(curr);	if (!pair) /* should not happen */	{	    eventlog(eventlog_level_error,__FUNCTION__,"watchlist contains NULL item");	    return -1;	}	if (pair->who==who)	{	    if (list_remove_elem(watchlist_head,&curr)<0)	    {		eventlog(eventlog_level_error,__FUNCTION__,"could not remove item");		pair->owner = NULL;	    }	    else	      { xfree(pair); }	}    }        return 0;}static int handle_event_whisper(t_account *account, char const *gamename, t_clienttag clienttag, t_watch_event event){    t_elem const * curr;    t_watch_pair * pair;    char msg[512];    int cnt = 0;    char const *myusername;    t_list * flist;    t_connection * dest_c, * my_c;    t_friend * fr;    char const * game_title;    if (!account)    {	eventlog(eventlog_level_error,__FUNCTION__,"got NULL account");	return -1;    }    if (!(myusername = account_get_name(account)))    {	eventlog(eventlog_level_error,__FUNCTION__,"got NULL account name");	return -1;    }    my_c = account_get_conn(account);    game_title = clienttag_get_title(clienttag);    /* mutual friends handling */    flist = account_get_friends(account);    if(flist)    {        if (event == watch_event_joingame) {    	    if (gamename)	        sprintf(msg,"Your friend %s has entered a %s game named \"%s\".",myusername,game_title,gamename);    	    else	        sprintf(msg,"Your friend %s has entered a %s game",myusername,game_title);    	}        if (event == watch_event_leavegame)sprintf(msg,"Your friend %s has left a %s game.",myusername,game_title);        if (event == watch_event_login)    sprintf(msg,"Your friend %s has entered %s.",myusername,prefs_get_servername());        if (event == watch_event_logout)   sprintf(msg,"Your friend %s has left %s.",myusername,prefs_get_servername());        LIST_TRAVERSE(flist,curr)        {             if (!(fr = elem_get_data(curr)))            {                eventlog(eventlog_level_error,__FUNCTION__,"found NULL entry in list");                continue;            }                    dest_c = connlist_find_connection_by_account(fr->friendacc);                  if (dest_c==NULL) /* If friend is offline, go on to next */	        continue;            else {     		cnt++;	/* keep track of successful whispers */	    	if(friend_get_mutual(fr))        	    message_send_text(dest_c,message_type_whisper,NULL,msg);	    }    	}    }    if (cnt) eventlog(eventlog_level_info,__FUNCTION__,"notified %d friends about %s",cnt,myusername);    /* watchlist handling */    if (event == watch_event_joingame)     {	if (gamename)    	    sprintf(msg,"Watched user %s has entered a %s game named \"%s\".",myusername,game_title,gamename);	else	    sprintf(msg,"Watched user %s has entered a %s game",myusername,game_title);    }    if (event == watch_event_leavegame)sprintf(msg,"Watched user %s has left a %s game.",myusername,game_title);    if (event == watch_event_login)    sprintf(msg,"Watched user %s has entered %s.",myusername,prefs_get_servername());    if (event == watch_event_logout)   sprintf(msg,"Watched user %s has left %s",myusername,prefs_get_servername());    LIST_TRAVERSE_CONST(watchlist_head,curr)    {      pair = elem_get_data(curr);      if (!pair) /* should not happen */	{	  eventlog(eventlog_level_error,__FUNCTION__,"watchlist contains NULL item");	  return -1;	}	if (pair->owner && (!pair->who || pair->who==account) && ((!pair->clienttag) || (clienttag == pair->clienttag)) && (pair->what&event))	{	    message_send_text(pair->owner,message_type_whisper,NULL,msg);	}    }      return 0;}extern int watchlist_notify_event(t_account * who, char const * gamename, t_clienttag clienttag, t_watch_event event){    switch (event)    {    case watch_event_login:    case watch_event_logout:    case watch_event_joingame:    case watch_event_leavegame:      handle_event_whisper(who,gamename,clienttag,event);      break;    default:      eventlog(eventlog_level_error,__FUNCTION__,"got unknown event %u",(unsigned int)event);      return -1;    }    return 0;}extern int watchlist_create(void){    watchlist_head = list_create();    return 0;}extern int watchlist_destroy(void){    t_elem *       curr;    t_watch_pair * pair;        if (watchlist_head)    {	LIST_TRAVERSE(watchlist_head,curr)	{	    pair = elem_get_data(curr);	    if (!pair) /* should not happen */	    {		eventlog(eventlog_level_error,__FUNCTION__,"watchlist contains NULL item");		continue;	    }	    	    if (list_remove_elem(watchlist_head,&curr)<0)        	eventlog(eventlog_level_error,__FUNCTION__,"could not remove item from list");	    xfree(pair);	}		if (list_destroy(watchlist_head)<0)	    return -1;	watchlist_head = NULL;    }        return 0;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -