Topic: /fcomment
Написал команду для комментирования друзей, что бы добавить себе в pvpgn делайте так:
В account_wrap.h добавить:
extern int account_set_friend_comment(t_account * account, int friendnum, const char * comment);
extern const char * account_get_friend_comment(t_account * account, int friendnum);
В account_wrap.cpp добавить:
extern int account_set_friend_comment(t_account * account, int friendnum, const char * comment)
{
char key[256];
if (friendnum < 0 || friendnum >= prefs_get_max_friends() || strlen(comment) == 0)
{
return -1;
}
std::sprintf(key, "friend\\%d\\comment", friendnum);
return account_set_strattr(account, key, comment);
}
extern const char * account_get_friend_comment(t_account * account, int friendnum)
{
char key[256];
const char * comment;
if (friendnum < 0 || friendnum >= prefs_get_max_friends())
{
return "bad request.";
}
std::sprintf(key, "friend\\%d\\comment", friendnum);
comment = account_get_strattr(account, key);
if (0 == _stricmp(comment, "(null)"))
return " no comment ";
else
return comment;
}
В command.cpp добавить новую команду:
static int _handle_fcomment_command(t_connection * c, char const * text)
{
t_account * my_acc = conn_get_account(c);
t_account * friend_acc;
t_friend * fr;
t_list * flist;
int num, i;
unsigned int uid;
bool found = false;
text = skip_command(text);
char username[16];
int space;
for (space = 0; space < 17; space++)
if (text[space] == ' ') break;
if (space == 17)
{
message_send_text(c, message_type_error, c, "Bad username!");
message_send_text(c, message_type_info, c, "usage: /fcomment <username> <comment>");
return 0;
}
memcpy(username, text, space);
text = skip_command(text);
username[space] = '\0';
num = account_get_friendcount(my_acc);
flist = account_get_friends(my_acc);
if (flist != NULL) {
for (i = 0; i < num; i++)
{
if ((!(uid = account_get_friend(my_acc, i))) || (!(fr = friendlist_find_uid(flist, uid))))
{
eventlog(eventlog_level_error, __FUNCTION__, "friend uid in list");
continue;
}
friend_acc = friend_get_account(fr);
if (0 == _stricmp(username, account_get_name(friend_acc)))
{
found = true;
account_set_friend_comment(my_acc, i, text);
snprintf(msgtemp, sizeof(msgtemp), "You set comment \"%s\" for friend: %.16s", text,username);
message_send_text(c, message_type_info, c, msgtemp);
}
else continue;
}
}
if (!found)
{
message_send_text(c, message_type_error, c, "No friend with this username!");
message_send_text(c, message_type_info, c, "usage: /fcomment <username> <comment>");
return 0;
}
return 0;
}
И заменить команду static int _handle_friends_command(t_connection * c, char const * text)
на эту:
static int _handle_friends_command(t_connection * c, char const * text)
{
int i;
t_account *my_acc = conn_get_account(c);
text = skip_command(text);
if (strstart(text, "add") == 0 || strstart(text, "a") == 0) {
char msgtemp[MAX_MESSAGE_LEN];
t_packet * rpacket;
t_connection * dest_c;
t_account * friend_acc;
t_server_friendslistreply_status status;
t_game * game;
t_channel * channel;
char stat;
t_list * flist;
t_friend * fr;
text = skip_command(text);
if (text[0] == '\0') {
message_send_text(c, message_type_info, c, "usage: /f add <username>");
return 0;
}
if (!(friend_acc = accountlist_find_account(text))) {
message_send_text(c, message_type_info, c, "That user does not exist.");
return 0;
}
switch (account_add_friend(my_acc, friend_acc)) {
case -1:
message_send_text(c, message_type_error, c, "Server error.");
return 0;
case -2:
message_send_text(c, message_type_info, c, "You can't add yourself to your friends list.");
return 0;
case -3:
snprintf(msgtemp, sizeof(msgtemp), "You can only have a maximum of %d friends.", prefs_get_max_friends());
message_send_text(c, message_type_info, c, msgtemp);
return 0;
case -4:
snprintf(msgtemp, sizeof(msgtemp), "%.64s is already on your friends list!", text);
message_send_text(c, message_type_info, c, msgtemp);
return 0;
}
snprintf(msgtemp, sizeof(msgtemp), "Added %.64s to your friends list.", text);
message_send_text(c, message_type_info, c, msgtemp);
dest_c = connlist_find_connection_by_account(friend_acc);
if (dest_c != NULL) {
snprintf(msgtemp, sizeof(msgtemp), "%.64s added you to his/her friends list.", conn_get_username(c));
message_send_text(dest_c, message_type_info, dest_c, msgtemp);
}
if ((conn_get_class(c) != conn_class_bnet) || (!(rpacket = packet_create(packet_class_bnet))))
return 0;
packet_set_size(rpacket, sizeof(t_server_friendadd_ack));
packet_set_type(rpacket, SERVER_FRIENDADD_ACK);
packet_append_string(rpacket, account_get_name(friend_acc));
game = NULL;
channel = NULL;
if (!(dest_c))
{
bn_byte_set(&status.location, FRIENDSTATUS_OFFLINE);
bn_byte_set(&status.status, 0);
bn_int_set(&status.clienttag, 0);
}
else
{
bn_int_set(&status.clienttag, conn_get_clienttag(dest_c));
stat = 0;
flist = account_get_friends(my_acc);
fr = friendlist_find_account(flist, friend_acc);
if ((friend_get_mutual(fr))) stat |= FRIEND_TYPE_MUTUAL;
if ((conn_get_dndstr(dest_c))) stat |= FRIEND_TYPE_DND;
if ((conn_get_awaystr(dest_c))) stat |= FRIEND_TYPE_AWAY;
bn_byte_set(&status.status, stat);
if ((game = conn_get_game(dest_c)))
{
if (game_get_flag(game) != game_flag_private)
bn_byte_set(&status.location, FRIENDSTATUS_PUBLIC_GAME);
else
bn_byte_set(&status.location, FRIENDSTATUS_PRIVATE_GAME);
}
else if ((channel = conn_get_channel(dest_c)))
{
bn_byte_set(&status.location, FRIENDSTATUS_CHAT);
}
else
{
bn_byte_set(&status.location, FRIENDSTATUS_ONLINE);
}
}
packet_append_data(rpacket, &status, sizeof(status));
if (game) packet_append_string(rpacket, game_get_name(game));
else if (channel) packet_append_string(rpacket, channel_get_name(channel));
else packet_append_string(rpacket, "");
conn_push_outqueue(c, rpacket);
packet_del_ref(rpacket);
}
else if (strstart(text, "msg") == 0 || strstart(text, "w") == 0 || strstart(text, "whisper") == 0 || strstart(text, "m") == 0)
{
char const *msg;
int cnt = 0;
t_connection * dest_c;
t_elem * curr;
t_friend * fr;
t_list * flist;
msg = skip_command(text);
/* if the message test is empty then ignore command */
if (msg[0] == '\0') {
message_send_text(c, message_type_info, c, "Did not message any friends. Type some text next time.");
return 0;
}
flist = account_get_friends(my_acc);
if (flist == NULL)
return -1;
LIST_TRAVERSE(flist, curr)
{
if (!(fr = (t_friend*)elem_get_data(curr))) {
eventlog(eventlog_level_error, __FUNCTION__, "found NULL entry in list");
continue;
}
if (friend_get_mutual(fr)) {
dest_c = connlist_find_connection_by_account(friend_get_account(fr));
if (!dest_c) continue;
message_send_text(dest_c, message_type_whisper, c, msg);
cnt++;
}
}
if (cnt)
message_send_text(c, message_type_friendwhisperack, c, msg);
else
message_send_text(c, message_type_info, c, "All your friends are offline.");
}
else if (strstart(text, "r") == 0 || strstart(text, "remove") == 0
|| strstart(text, "del") == 0 || strstart(text, "delete") == 0) {
int num;
char msgtemp[MAX_MESSAGE_LEN];
t_packet * rpacket;
text = skip_command(text);
if (text[0] == '\0') {
message_send_text(c, message_type_info, c, "usage: /f remove <username>");
return 0;
}
switch ((num = account_remove_friend2(my_acc, text))) {
case -1: return -1;
case -2:
snprintf(msgtemp, sizeof(msgtemp), "%.64s was not found on your friends list.", text);
message_send_text(c, message_type_info, c, msgtemp);
return 0;
default:
snprintf(msgtemp, sizeof(msgtemp), "Removed %.64s from your friends list.", text);
message_send_text(c, message_type_info, c, msgtemp);
if ((conn_get_class(c) != conn_class_bnet) || (!(rpacket = packet_create(packet_class_bnet))))
return 0;
packet_set_size(rpacket, sizeof(t_server_frienddel_ack));
packet_set_type(rpacket, SERVER_FRIENDDEL_ACK);
bn_byte_set(&rpacket->u.server_frienddel_ack.friendnum, num);
conn_push_outqueue(c, rpacket);
packet_del_ref(rpacket);
return 0;
}
}
else if (strstart(text, "p") == 0 || strstart(text, "promote") == 0) {
int num;
int n;
char msgtemp[MAX_MESSAGE_LEN];
char const * dest_name;
t_packet * rpacket;
t_list * flist;
t_friend * fr;
t_account * dest_acc;
unsigned int dest_uid;
text = skip_command(text);
if (text[0] == '\0') {
message_send_text(c, message_type_info, c, "usage: /f promote <username>");
return 0;
}
num = account_get_friendcount(my_acc);
flist = account_get_friends(my_acc);
for (n = 1; n < num; n++)
if ((dest_uid = account_get_friend(my_acc, n)) &&
(fr = friendlist_find_uid(flist, dest_uid)) &&
(dest_acc = friend_get_account(fr)) &&
(dest_name = account_get_name(dest_acc)) &&
(strcasecmp(dest_name, text) == 0))
{
account_set_friend(my_acc, n, account_get_friend(my_acc, n - 1));
account_set_friend(my_acc, n - 1, dest_uid);
snprintf(msgtemp, sizeof(msgtemp), "Premoted %.64s in your friends list.", dest_name);
message_send_text(c, message_type_info, c, msgtemp);
if ((conn_get_class(c) != conn_class_bnet) || (!(rpacket = packet_create(packet_class_bnet))))
return 0;
packet_set_size(rpacket, sizeof(t_server_friendmove_ack));
packet_set_type(rpacket, SERVER_FRIENDMOVE_ACK);
bn_byte_set(&rpacket->u.server_friendmove_ack.pos1, n - 1);
bn_byte_set(&rpacket->u.server_friendmove_ack.pos2, n);
conn_push_outqueue(c, rpacket);
packet_del_ref(rpacket);
return 0;
}
}
else if (strstart(text, "d") == 0 || strstart(text, "demote") == 0) {
int num;
int n;
char msgtemp[MAX_MESSAGE_LEN];
char const * dest_name;
t_packet * rpacket;
t_list * flist;
t_friend * fr;
t_account * dest_acc;
unsigned int dest_uid;
text = skip_command(text);
if (text[0] == '\0') {
message_send_text(c, message_type_info, c, "usage: /f demote <username>");
return 0;
}
num = account_get_friendcount(my_acc);
flist = account_get_friends(my_acc);
for (n = 0; n < num - 1; n++)
if ((dest_uid = account_get_friend(my_acc, n)) &&
(fr = friendlist_find_uid(flist, dest_uid)) &&
(dest_acc = friend_get_account(fr)) &&
(dest_name = account_get_name(dest_acc)) &&
(strcasecmp(dest_name, text) == 0))
{
account_set_friend(my_acc, n, account_get_friend(my_acc, n + 1));
account_set_friend(my_acc, n + 1, dest_uid);
snprintf(msgtemp, sizeof(msgtemp), "Premoted %.64s in your friends list.", dest_name);
message_send_text(c, message_type_info, c, msgtemp);
if ((conn_get_class(c) != conn_class_bnet) || (!(rpacket = packet_create(packet_class_bnet))))
return 0;
packet_set_size(rpacket, sizeof(t_server_friendmove_ack));
packet_set_type(rpacket, SERVER_FRIENDMOVE_ACK);
bn_byte_set(&rpacket->u.server_friendmove_ack.pos1, n);
bn_byte_set(&rpacket->u.server_friendmove_ack.pos2, n + 1);
conn_push_outqueue(c, rpacket);
packet_del_ref(rpacket);
return 0;
}
}
else if (strstart(text, "list") == 0 || strstart(text, "l") == 0) {
char const * frienduid;
char status[128];
char software[64];
char msgtemp[MAX_MESSAGE_LEN];
t_connection * dest_c;
t_account * friend_acc;
t_game const * game;
t_channel const * channel;
t_friend * fr;
t_list * flist;
int num;
unsigned int uid;
message_send_text(c, message_type_info, c, "Your PvPGN - Friends List");
message_send_text(c, message_type_info, c, "=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=");
num = account_get_friendcount(my_acc);
flist = account_get_friends(my_acc);
if (flist != NULL) {
for (i = 0; i < num; i++)
{
if ((!(uid = account_get_friend(my_acc, i))) || (!(fr = friendlist_find_uid(flist, uid))))
{
eventlog(eventlog_level_error, __FUNCTION__, "friend uid in list");
continue;
}
software[0] = '\0';
friend_acc = friend_get_account(fr);
if (!(dest_c = connlist_find_connection_by_account(friend_acc)))
std::sprintf(status, ", offline");
else {
std::sprintf(software, " using %s", clienttag_get_title(conn_get_clienttag(dest_c)));
if (friend_get_mutual(fr)) {
if ((game = conn_get_game(dest_c)))
std::sprintf(status, ", in game \"%.64s\"", game_get_name(game));
else if ((channel = conn_get_channel(dest_c))) {
if (strcasecmp(channel_get_name(channel), "Arranged Teams") == 0)
std::sprintf(status, ", in game AT Preparation");
else
std::sprintf(status, ", in channel \"%.64s\",", channel_get_name(channel));
}
else
std::sprintf(status, ", is in AT Preparation");
}
else {
if ((game = conn_get_game(dest_c)))
std::sprintf(status, ", is in a game");
else if ((channel = conn_get_channel(dest_c)))
std::sprintf(status, ", is in a chat channel");
else
std::sprintf(status, ", is in AT Preparation");
}
}
frienduid = account_get_name(friend_acc);
if (software[0]) snprintf(msgtemp, sizeof(msgtemp), "%d: %s%.16s(%s)%.128s, %.64s", i + 1, friend_get_mutual(fr) ? "*" : " ", frienduid, account_get_friend_comment(my_acc, i), status, software);
else snprintf(msgtemp, sizeof(msgtemp), "%d: %.16s(%s)%.128s", i + 1, frienduid, account_get_friend_comment(my_acc, i), status);
message_send_text(c, message_type_info, c, msgtemp);
}
}
message_send_text(c, message_type_info, c, "=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=");
message_send_text(c, message_type_info, c, "End of Friends List");
}
else {
message_send_text(c, message_type_info, c, "Friends List (Used in Arranged Teams and finding online friends.)");
message_send_text(c, message_type_info, c, "Type: /f add <username> (adds a friend to your list)");
message_send_text(c, message_type_info, c, "Type: /f del <username> (removes a friend from your list)");
message_send_text(c, message_type_info, c, "Type: /f promote <username> (promote a friend in your list)");
message_send_text(c, message_type_info, c, "Type: /f demote <username> (demote a friend in your list)");
message_send_text(c, message_type_info, c, "Type: /f list (shows your full friends list)");
message_send_text(c, message_type_info, c, "Type: /f msg (whispers a message to all your friends at once)");
}
return 0;
}
Скриншот: