Skip to content

Commit

Permalink
/alert command with messagebox_show function
Browse files Browse the repository at this point in the history
  • Loading branch information
HarpyWar committed May 24, 2014
1 parent af2bacc commit d4428c1
Show file tree
Hide file tree
Showing 10 changed files with 120 additions and 1 deletion.
7 changes: 7 additions & 0 deletions conf/bnhelp.conf.in
Original file line number Diff line number Diff line change
Expand Up @@ -211,6 +211,13 @@

Example: /realmann Hello everyone!

%alert
--------------------------------------------------------
/alert <message>
Show MessageBox with <message> to everyone. Use \n as a new line symbol.

Example: /alert Hello\neveryone!

%news
--------------------------------------------------------
/news
Expand Down
1 change: 1 addition & 0 deletions conf/command_groups.conf.in
Original file line number Diff line number Diff line change
Expand Up @@ -150,6 +150,7 @@

2 /realmann
2 /ann /announce
2 /alert

3 /serverban /ipban
3 /ipscan
Expand Down
54 changes: 54 additions & 0 deletions src/bnetd/command.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -371,6 +371,7 @@ namespace pvpgn
static int _handle_moderate_command(t_connection * c, char const * text);
static int _handle_clearstats_command(t_connection * c, char const * text);
static int _handle_tos_command(t_connection * c, char const * text);
static int _handle_alert_command(t_connection * c, char const * text);

static const t_command_table_row standard_command_table[] =
{
Expand Down Expand Up @@ -487,6 +488,7 @@ namespace pvpgn
{ "/moderate", _handle_moderate_command },
{ "/clearstats", _handle_clearstats_command },
{ "/icon", handle_icon_command },
{ "/alert", _handle_alert_command },

{ NULL, NULL }

Expand Down Expand Up @@ -5062,5 +5064,57 @@ namespace pvpgn
return 0;
}

/* Send message to all clients (similar to announce, but in messagebox) */
static int _handle_alert_command(t_connection * c, char const * text)
{
char const * channel_name;
const char * topic;
t_clienttag clienttag;
t_clienttag clienttag_dest;

clienttag = conn_get_clienttag(c);
// disallow clients that doesn't support SID_MESSAGEBOX
if (clienttag != CLIENTTAG_STARCRAFT_UINT && clienttag != CLIENTTAG_BROODWARS_UINT && clienttag != CLIENTTAG_STARJAPAN_UINT && clienttag != CLIENTTAG_SHAREWARE_UINT &&
clienttag != CLIENTTAG_DIABLORTL_UINT && clienttag != CLIENTTAG_DIABLOSHR_UINT &&
clienttag != CLIENTTAG_WARCIIBNE_UINT && clienttag != CLIENTTAG_BNCHATBOT_UINT)
{
message_send_text(c, message_type_error, c, "Your game client doesn't support MessageBox.");
return -1;
}

std::vector<std::string> args = split_command(text, 1);
if (args[1].empty())
{
describe_command(c, args[0].c_str());
return 0;
}

// reduntant line - it adds a caption to message box
std::string goodtext = args[1] + "\n\n***************************\nBy " + conn_get_username(c);

// caption
snprintf(msgtemp, sizeof(msgtemp), "Information from %.64s", prefs_get_servername());

t_connection * conn;
t_elem const * curr;
// send to online users
LIST_TRAVERSE_CONST(connlist(), curr)
{
if (conn = (t_connection*)elem_get_data(curr))
{
clienttag_dest = conn_get_clienttag(conn);

if (clienttag_dest != CLIENTTAG_STARCRAFT_UINT && clienttag_dest != CLIENTTAG_BROODWARS_UINT && clienttag_dest != CLIENTTAG_STARJAPAN_UINT && clienttag_dest != CLIENTTAG_SHAREWARE_UINT &&
clienttag_dest != CLIENTTAG_DIABLORTL_UINT && clienttag_dest != CLIENTTAG_DIABLOSHR_UINT &&
clienttag_dest != CLIENTTAG_WARCIIBNE_UINT && clienttag_dest != CLIENTTAG_BNCHATBOT_UINT) {
continue;
}
messagebox_show(conn, goodtext.c_str(), msgtemp);
}
}

return 0;
}

}
}
22 changes: 22 additions & 0 deletions src/bnetd/message.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@

#include <cstring>
#include <cerrno>
#include <string>

#include "compat/gethostname.h"
#include "common/xalloc.h"
Expand All @@ -33,6 +34,7 @@
#include "common/bn_type.h"
#include "common/list.h"
#include "common/util.h"
#include "common/xstring.h"

#include "account.h"
#include "account_wrap.h"
Expand Down Expand Up @@ -1712,6 +1714,26 @@ namespace pvpgn
return 0;
}

/* Show message box on a client side (https://github.com/HarpyWar/pvpgn/issues/15) */
extern int messagebox_show(t_connection * dst, char const * text, char const * caption, int type)
{
t_packet *rpacket;

std::string newtext = str_replace_nl(text);

if ((rpacket = packet_create(packet_class_bnet)))
{
packet_set_size(rpacket, sizeof(t_server_messagebox));
packet_set_type(rpacket, SERVER_MESSAGEBOX);
bn_int_set(&rpacket->u.server_messagebox.style, type);
packet_append_string(rpacket, newtext.c_str());
packet_append_string(rpacket, caption);
conn_push_outqueue(dst, rpacket);
packet_del_ref(rpacket);
}
return 0;
}

}

}
2 changes: 2 additions & 0 deletions src/bnetd/message.h
Original file line number Diff line number Diff line change
Expand Up @@ -121,6 +121,7 @@ namespace pvpgn
#include <cstdio>
#define JUST_NEED_TYPES
#include "connection.h"
#include "common/bnet_protocol.h"
#undef JUST_NEED_TYPES

namespace pvpgn
Expand All @@ -140,6 +141,7 @@ namespace pvpgn
extern int message_send_text(t_connection * dst, t_message_type type, t_connection * src, char const * text);
extern int message_send_formatted(t_connection * dst, char const * text);
extern int message_send_file(t_connection * dst, std::FILE * fd);
extern int messagebox_show(t_connection * dst, char const * text, char const * caption = "", int type = SERVER_MESSAGEBOX_OK);

}

Expand Down
16 changes: 15 additions & 1 deletion src/common/bnet_protocol.h
Original file line number Diff line number Diff line change
Expand Up @@ -4052,7 +4052,21 @@ namespace pvpgn
*/
} PACKED_ATTR() t_server_clanmemberupdate;



#define SERVER_MESSAGEBOX 0x19ff
typedef struct
{
t_bnet_header h;
bn_int style;
/* Text */
/* Caption */
} PACKED_ATTR() t_server_messagebox;
#define SERVER_MESSAGEBOX_OK 0x00000000
#define SERVER_MESSAGEBOX_OKCANCEL 0x00000001
#define SERVER_MESSAGEBOX_YESNO 0x00000004


}

#endif

2 changes: 2 additions & 0 deletions src/common/packet.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -746,6 +746,8 @@ namespace pvpgn
return "SERVER_CLANMEMBER_REMOVED_NOTIFY";
case SERVER_CLANMEMBERUPDATE:
return "SERVER_CLANMEMBERUPDATE";
case SERVER_MESSAGEBOX:
return "SERVER_MESSAGEBOX";
}
return "unknown";

Expand Down
2 changes: 2 additions & 0 deletions src/common/packet.h
Original file line number Diff line number Diff line change
Expand Up @@ -365,6 +365,8 @@ namespace pvpgn
t_server_claninforeply server_claninforeply;
t_client_findanongame_profile_clan client_findanongame_profile_clan;
t_server_findanongame_profile_clan server_findanongame_profile_clan;

t_server_messagebox server_messagebox;
} u;
} t_packet;

Expand Down
14 changes: 14 additions & 0 deletions src/common/xstring.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@
#include <string>
#include <vector>
#include <sstream>
#include <iomanip>

#include "compat/strdup.h"
#include "common/xalloc.h"
Expand Down Expand Up @@ -365,4 +366,17 @@ namespace pvpgn

return result;
}

/* Replace "\n" in string to a new line character '\n' */
extern std::string str_replace_nl(char const * text)
{
std::string s(text);
size_t pos = 0;
while ((pos = s.find("\\n", pos)) != std::string::npos) {
s.replace(pos, 2, "\n");
}
return s;
}


}
1 change: 1 addition & 0 deletions src/common/xstring.h
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@ namespace pvpgn
extern char * str_strip_affix(char * str, char const * affix);
extern const char *str_replace(char *orig, char *rep, char *with);
extern std::vector<std::string> split_command(char const * text, int args_count);
extern std::string str_replace_nl(char const * text);

/*
Fix for std::string for some unix compilers
Expand Down

0 comments on commit d4428c1

Please sign in to comment.