sas Mon Jul 7 10:39:03 2003 EDT
Modified files: (Branch: PHP_4_3)
/php-src/ext/ircg ircg.c php_ircg.h
Log:
Add support for who/invite/notice/lusers
Add ircg_names/ircg_invite/ircg_lusers/ircg_oper/ircg_who/ircg_list
# feature patch applied to PHP_4_3 due to "won't be released status"
# of PHP_4 and HEAD being IRCG 3 incompatible.
Index: php-src/ext/ircg/ircg.c
diff -u php-src/ext/ircg/ircg.c:1.137.2.11 php-src/ext/ircg/ircg.c:1.137.2.12
--- php-src/ext/ircg/ircg.c:1.137.2.11 Thu Jul 3 02:59:43 2003
+++ php-src/ext/ircg/ircg.c Mon Jul 7 10:39:03 2003
@@ -16,7 +16,7 @@
+----------------------------------------------------------------------+
*/
-/* $Id: ircg.c,v 1.137.2.11 2003/07/03 06:59:43 sas Exp $ */
+/* $Id: ircg.c,v 1.137.2.12 2003/07/07 14:39:03 sas Exp $ */
/* {{{ includes */
@@ -105,6 +105,18 @@
FMT_MSG_DISCONNECTED,
FMT_MSG_LIST,
FMT_MSG_LISTEND,
+ FMT_MSG_WHOREPLY1,
+ FMT_MSG_WHOREPLY2,
+ FMT_MSG_ENDOFWHO,
+ FMT_MSG_INVITE,
+ FMT_MSG_NOTICE_CHAN,
+ FMT_MSG_NOTICE_TO_ME,
+ FMT_MSG_NOTICE_FROM_ME,
+ FMT_MSG_LUSERCLIENT,
+ FMT_MSG_LUSEROP,
+ FMT_MSG_LUSERUNKNOWN,
+ FMT_MSG_LUSERCHANNELS,
+ FMT_MSG_LUSERME,
NO_FMTS
};
/* }}} */
@@ -136,6 +148,12 @@
PHP_FE(ircg_register_format_messages, NULL)
PHP_FE(ircg_get_username, NULL)
PHP_FE(ircg_eval_ecmascript_params, NULL)
+ PHP_FE(ircg_names, NULL)
+ PHP_FE(ircg_invite, NULL)
+ PHP_FE(ircg_lusers, NULL)
+ PHP_FE(ircg_oper, NULL)
+ PHP_FE(ircg_who, NULL)
+ PHP_FE(ircg_list, NULL)
{NULL, NULL, NULL} /* Must be the last line in ircg_functions[] */
};
/* }}} */
@@ -260,7 +278,19 @@
"end of ban list for %c<br />",
"You have been disconnected<br />",
"Channel %c has %t users and the topic is '%m'<br />",
- "End of LIST<br />"
+ "End of LIST<br />",
+ "Nickname %t has ident %f, realname '%m', hostname %c, ",
+ "is on server %t, has flag %f, hopcount %m, and channel %c.<br />",
+ "end of who<br />",
+ "%f is inviting %t to %c<br />",
+ "[notice %c] %f: %m<br />",
+ "notice from %f: %m<br />",
+ "notice to %t: %m<br />",
+ "%t users, %f services, %r servers<br />",
+ "%r operators<br />",
+ "%r unknown connections<br />",
+ "%r formed channels<br />",
+ "I have %t clients and %r servers<br />",
};
/* }}} */
@@ -885,6 +915,27 @@
msg_send(conn, &m);
}
+static void notice_handler(irconn_t *ircc, smart_str *chan, smart_str *from,
+ smart_str *msg, void *conn_data, void *chan_data)
+{
+ php_irconn_t *conn = conn_data;
+ smart_str m = {0};
+ smart_str s_username;
+
+ smart_str_setl(&s_username, ircc->username, ircc->username_len);
+
+ if (msg->c[0] == '\001') {
+ handle_ctcp(conn, chan, from, chan?chan:&s_username, msg, &m);
+ } else if (chan) {
+ FORMAT_MSG(conn, FMT_MSG_NOTICE_CHAN, chan, &s_username, from, msg, &m,
conn->conn.username, conn->conn.username_len);
+ } else {
+ FORMAT_MSG(conn, FMT_MSG_NOTICE_TO_ME, NULL, &s_username, from,
+ msg, &m, conn->conn.username, conn->conn.username_len);
+ }
+
+ msg_send(conn, &m);
+}
+
static void nick_handler(irconn_t *c, smart_str *oldnick, smart_str *newnick,
void *dummy)
{
@@ -976,6 +1027,104 @@
msg_send(conn, &m);
}
+static void whoreply_handler(irconn_t *c, smart_str *chan, smart_str *user,
+ smart_str *host, smart_str *server, smart_str *nick, smart_str *flag,
+ smart_str *hopcount, smart_str *realname, void *dummy,
+ void *chan_data)
+{
+ php_irconn_t *conn = dummy;
+ smart_str m = {0};
+
+ FORMAT_MSG(conn, FMT_MSG_WHOREPLY1, host, nick, user, realname, &m,
+ conn->conn.username, conn->conn.username_len);
+
+ FORMAT_MSG(conn, FMT_MSG_WHOREPLY2, chan, server, flag, hopcount, &m,
+ conn->conn.username, conn->conn.username_len);
+ msg_send(conn, &m);
+}
+
+static void endofwho_handler(irconn_t *c, void *dummy)
+{
+ php_irconn_t *conn = dummy;
+ smart_str m = {0};
+
+ FORMAT_MSG(conn, FMT_MSG_ENDOFWHO, NULL, NULL, NULL, NULL, &m,
+ conn->conn.username, conn->conn.username_len);
+
+ msg_send(conn, &m);
+}
+
+static void invite_handler(irconn_t *c, smart_str *nick, smart_str *chan, int mode,
void *dummy)
+{
+ php_irconn_t *conn = dummy;
+ smart_str m = {0};
+ smart_str *from, *to, tmp = {0};
+
+ smart_str_setl(&tmp, conn->conn.username, conn->conn.username_len);
+ if (mode == 1) {
+ from = &tmp;
+ to = nick;
+ } else {
+ from = nick;
+ to = &tmp;
+ }
+
+ FORMAT_MSG(conn, FMT_MSG_INVITE, chan, to, from, NULL, &m,
+ conn->conn.username, conn->conn.username_len);
+ msg_send(conn, &m);
+}
+
+
+static void luserclient_handler(irconn_t *c, smart_str *users, smart_str *services,
smart_str *servers)
+{
+ php_irconn_t *conn = dummy;
+ smart_str m = {0};
+
+ FORMAT_MSG(conn, FMT_MSG_LUSERCLIENT, NULL, users, services, servers, &m,
+ conn->conn.username, conn->conn.username_len);
+ msg_send(conn, &m);
+}
+
+static void luserme_handler(irconn_t *c, smart_str *users, smart_str *servers)
+{
+ php_irconn_t *conn = dummy;
+ smart_str m = {0};
+
+ FORMAT_MSG(conn, FMT_MSG_LUSERME, NULL, users, NULL, servers, &m,
+ conn->conn.username, conn->conn.username_len);
+ msg_send(conn, &m);
+}
+
+static void luserop_t(irconn_t *dummy, smart_str *str)
+{
+ php_irconn_t *conn = dummy;
+ smart_str m = {0};
+
+ FORMAT_MSG(conn, FMT_MSG_LUSEROP, NULL, NULL, NULL, str, &m,
+ conn->conn.username, conn->conn.username_len);
+ msg_send(conn, &m);
+}
+
+static void luserunknown_t(irconn_t *dummy, smart_str *str)
+{
+ php_irconn_t *conn = dummy;
+ smart_str m = {0};
+
+ FORMAT_MSG(conn, FMT_MSG_LUSERUNKNOWN, NULL, NULL, NULL, str, &m,
+ conn->conn.username, conn->conn.username_len);
+ msg_send(conn, &m);
+}
+
+static void luserchannels_t(irconn_t *dummy, smart_str *str)
+{
+ php_irconn_t *conn = dummy;
+ smart_str m = {0};
+
+ FORMAT_MSG(conn, FMT_MSG_LUSERCHANNELS, NULL, NULL, NULL, str, &m,
+ conn->conn.username, conn->conn.username_len);
+ msg_send(conn, &m);
+}
+
/* }}} */
/* {{{ Post-connection error-storage */
@@ -1514,7 +1663,32 @@
}
/* }}} */
-/* {{{ proto bool ircg_whois( int connection, string nick)
+/* {{{ proto bool ircg_oper(int connection, string name, string password)
+ Elevates privileges to IRC OPER */
+PHP_FUNCTION(ircg_oper)
+{
+ zval **p1, **p2, **p3;
+ php_irconn_t *conn;
+
+ if (ZEND_NUM_ARGS() != 3
+ || zend_get_parameters_ex(ZEND_NUM_ARGS(), &p1, &p2, &p3) ==
FAILURE)
+ WRONG_PARAM_COUNT;
+
+ convert_to_long_ex(p1);
+ convert_to_string_ex(p2);
+ convert_to_string_ex(p3);
+
+ conn = lookup_irconn(Z_LVAL_PP(p1));
+
+ if (!conn) RETURN_FALSE;
+
+ irc_handle_command(&conn->conn, "OPER", 2, Z_STRVAL_PP(p2), Z_STRVAL_PP(p3));
+
+ RETVAL_TRUE;
+}
+/* }}} */
+
+/* {{{ proto bool ircg_whois(int connection, string nick)
Queries user information for nick on server */
PHP_FUNCTION(ircg_whois)
{
@@ -1538,7 +1712,99 @@
}
/* }}} */
-/* {{{ proto bool ircg_ignore_add(resource connection, string nick)
+/* {{{ proto bool ircg_who(int connection, string mask [, bool ops_only])
+ Queries server for WHO information */
+#if IRCG_API_VERSION >= 20021115
+PHP_FUNCTION(ircg_who)
+{
+ int ops = 0;
+ zval **p1, **p2, **p3;
+ php_irconn_t *conn;
+
+ if (ZEND_NUM_ARGS() < 2 || ZEND_NUM_ARGS() > 3
+ || zend_get_parameters_ex(ZEND_NUM_ARGS(), &p1, &p2, &p3) == FAILURE)
+ WRONG_PARAM_COUNT;
+
+ convert_to_long_ex(p1);
+ convert_to_string_ex(p2);
+
+ if (ZEND_NUM_ARGS() > 2) {
+ convert_to_boolean_ex(p3);
+ ops = Z_BVAL_PP(p3);
+ }
+
+ conn = lookup_irconn(Z_LVAL_PP(p1));
+
+ if (!conn) RETURN_FALSE;
+
+ irc_handle_command(&conn->conn, "WHO", ops ? 2 : 1, Z_STRVAL_PP(p2), "o");
+
+ put_irconn(conn);
+
+ RETVAL_TRUE;
+}
+#endif
+/* }}} */
+
+/* {{{ proto bool ircg_invite(int connection, string channel, string nickname)
+ INVITEs nickname to channel */
+#if IRCG_API_VERSION >= 20021117
+PHP_FUNCTION(ircg_invite)
+{
+ zval **p1, **p2, **p3;
+ php_irconn_t *conn;
+
+ if (ZEND_NUM_ARGS() != 3
+ || zend_get_parameters_ex(3, &p1, &p2, &p3) == FAILURE)
+ WRONG_PARAM_COUNT;
+
+ convert_to_long_ex(p1);
+ convert_to_string_ex(p2);
+ convert_to_string_ex(p3);
+
+ conn = lookup_irconn(Z_LVAL_PP(p1));
+
+ if (!conn) RETURN_FALSE;
+
+ irc_handle_command(&conn->conn, "INVITE", 2, Z_STRVAL_PP(p3),
+ Z_STRVAL_PP(p2));
+ put_irconn(conn);
+
+ RETVAL_TRUE;
+}
+#endif
+/* }}} */
+
+
+/* {{{ proto bool ircg_names( int connection, string channel [, string target])
+ Queries visible usernames */
+PHP_FUNCTION(ircg_names)
+{
+ zval **p1, **p2, **p3;
+ php_irconn_t *conn;
+ int ac = ZEND_NUM_ARGS();
+
+ if (ac < 2 || ac > 3 || zend_get_parameters_ex(ac, &p1, &p2, &p3) == FAILURE)
+
+ WRONG_PARAM_COUNT;
+
+ convert_to_long_ex(p1);
+ convert_to_string_ex(p2);
+
+ if (ac > 2) {
+ convert_to_string_ex(p3);
+ }
+
+ conn = lookup_irconn(Z_LVAL_PP(p1));
+
+ if (!conn) RETURN_FALSE;
+
+ irc_handle_command(&conn->conn, "NAMES", ac > 2 ? 2 : 1, Z_STRVAL_PP(p2),
Z_STRVAL_PP(p3));
+ RETVAL_TRUE;
+}
+/* }}} */
+
+/* {{{ proto bool ircg_ignore_add(int connection, string nick)
Adds a user to your ignore list on a server */
PHP_FUNCTION(ircg_ignore_add)
{
@@ -1721,6 +1987,28 @@
}
/* }}} */
+/* {{{ proto bool ircg_lusers(int connection)
+ IRC network statistics */
+PHP_FUNCTION(ircg_lusers)
+{
+ zval **p1;
+ php_irconn_t *conn;
+
+ if (ZEND_NUM_ARGS() != 1 || zend_get_parameters_ex(1, &p1) == FAILURE)
+ WRONG_PARAM_COUNT;
+
+ convert_to_long_ex(p1);
+
+ conn = lookup_irconn(Z_LVAL_PP(p1));
+
+ if (!conn) RETURN_FALSE;
+
+ irc_handle_command(&conn->conn, "LUSERS", 0);
+ RETVAL_TRUE;
+}
+/* }}} */
+
+
/* {{{ proto bool ircg_part(int connection, string channel)
Leaves a channel */
PHP_FUNCTION(ircg_part)
@@ -1890,7 +2178,26 @@
#else
IFMSG(FMT_MSG_MASS_JOIN_ELEMENT, IRCG_USER_ADD, user_add);
#endif
-
+
+#if IRCG_API_VERSION >= 20021115
+ if (MSG_NOT_EMPTY(FMT_MSG_WHOREPLY1)
+ || MSG_NOT_EMPTY(FMT_MSG_WHOREPLY2)) {
+ irc_register_hook(conn, IRCG_WHOREPLY, whoreply_handler);
+ }
+ IFMSG(FMT_MSG_ENDOFWHO, IRCG_ENDOFWHO, endofwho_handler);
+#endif
+
+#if IRCG_API_VERSION >= 20021117
+ IFMSG(FMT_MSG_INVITE, IRCG_INVITE, invite_handler);
+#endif
+
+ irc_register_hook(conn, IRCG_NOTICE, notice_handler);
+
+ IFMSG(FMT_MSG_LUSERCLIENT, IRCG_LUSERCLIENT, luserclient_handler);
+ IFMSG(FMT_MSG_LUSERME, IRCG_LUSERME, luserme_handler);
+ IFMSG(FMT_MSG_LUSEROP, IRCG_LUSEROP, luserop_handler);
+ IFMSG(FMT_MSG_LUSERUNKNOWN, IRCG_LUSERUNKNOWN, luserunknown_handler);
+ IFMSG(FMT_MSG_LUSERCHANNELS, IRCG_LUSERCHANNELS, luserchannels_handler);
}
/* }}} */
Index: php-src/ext/ircg/php_ircg.h
diff -u php-src/ext/ircg/php_ircg.h:1.20.2.1 php-src/ext/ircg/php_ircg.h:1.20.2.2
--- php-src/ext/ircg/php_ircg.h:1.20.2.1 Tue Dec 31 11:34:48 2002
+++ php-src/ext/ircg/php_ircg.h Mon Jul 7 10:39:03 2003
@@ -54,6 +54,12 @@
PHP_FUNCTION(ircg_nickname_unescape);
PHP_FUNCTION(ircg_get_username);
PHP_FUNCTION(ircg_eval_ecmascript_params);
+PHP_FUNCTION(ircg_list);
+PHP_FUNCTION(ircg_who);
+PHP_FUNCTION(ircg_invite);
+PHP_FUNCTION(ircg_names);
+PHP_FUNCTION(ircg_lusers);
+PHP_FUNCTION(ircg_oper);
PHP_MINIT_FUNCTION(ircg);
PHP_MSHUTDOWN_FUNCTION(ircg);
--
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php