pidgin/purple-plugin-pack
Clone
Summary
Browse
Changes
Graph
Add the turtles target to keep the foot clan at bay
default
tip
13 months ago, Gary Kramlich
63ad7e4f10b4
Add the turtles target to keep the foot clan at bay
Testing Done:
Ran `ninja turtles` and verified it worked correctly.
Reviewed at https://reviews.imfreedom.org/r/2409/
/**
* @file ignore.c Ignore people.
*
* Copyright (C) 2007-2008 Sadrul Habib Chowdhury <sadrul@users.sourceforge.net>
*
* 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1301 USA
*/
/* If you can't figure out what this line is for, DON'T TOUCH IT. */
#include
"../common/pp_internal.h"
#include
<account.h>
#include
<blist.h>
#include
<cmds.h>
#include
<conversation.h>
#include
<debug.h>
#include
<plugin.h>
#include
<util.h>
#include
<string.h>
#define PREF_ROOT "/plugins/ignore"
static
PurpleCmdId
cmd
;
typedef
enum
{
IGNORE_ALL
=
1
<<
0
,
IGNORE_CHAT
=
1
<<
1
}
IgnoreContext
;
static
const
char
*
rule_key
(
PurpleAccount
*
account
,
const
char
*
name
)
{
static
char
key
[
1024
];
char
*
k
=
key
;
k
+=
snprintf
(
key
,
sizeof
(
key
),
PREF_ROOT
"/%s/%s/"
,
purple_account_get_protocol_id
(
account
),
purple_normalize
(
account
,
purple_account_get_username
(
account
)));
snprintf
(
k
,
sizeof
(
key
)
-
(
k
-
key
)
-
1
,
"%s"
,
purple_normalize
(
account
,
name
));
return
key
;
}
static
void
add_ignore_rule
(
IgnoreContext
context
,
const
char
*
name
,
PurpleAccount
*
account
)
{
GString
*
string
;
char
*
pref
;
char
*
lower_case_username
;
string
=
g_string_new
(
PREF_ROOT
);
string
=
g_string_append_c
(
string
,
'/'
);
string
=
g_string_append
(
string
,
purple_account_get_protocol_id
(
account
));
if
(
!
purple_prefs_exists
(
string
->
str
))
purple_prefs_add_none
(
string
->
str
);
string
=
g_string_append_c
(
string
,
'/'
);
string
=
g_string_append
(
string
,
purple_normalize
(
account
,
purple_account_get_username
(
account
)));
lower_case_username
=
g_ascii_strdown
(
string
->
str
,
string
->
len
);
if
(
!
purple_prefs_exists
(
lower_case_username
))
purple_prefs_add_none
(
lower_case_username
);
g_free
(
lower_case_username
);
string
=
g_string_append_c
(
string
,
'/'
);
string
=
g_string_append
(
string
,
purple_normalize
(
account
,
name
));
pref
=
g_ascii_strdown
(
string
->
str
,
string
->
len
);
if
(
!
purple_prefs_exists
(
pref
))
{
GList
*
list
=
purple_prefs_get_string_list
(
PREF_ROOT
"/rules"
);
purple_prefs_add_string
(
pref
,
context
==
IGNORE_ALL
?
"all"
:
"chat"
);
if
(
!
g_list_find_custom
(
list
,
pref
,
(
GCompareFunc
)
g_utf8_collate
))
{
list
=
g_list_prepend
(
list
,
g_strdup
(
pref
));
purple_prefs_set_string_list
(
PREF_ROOT
"/rules"
,
list
);
g_list_foreach
(
list
,
(
GFunc
)
g_free
,
NULL
);
g_list_free
(
list
);
}
}
else
{
purple_prefs_set_string
(
pref
,
context
==
IGNORE_ALL
?
"all"
:
"chat"
);
}
g_string_free
(
string
,
TRUE
);
g_free
(
pref
);
}
static
void
remove_ignore_rule_d
(
const
char
*
name
,
PurpleAccount
*
account
)
{
char
*
key
=
g_ascii_strdown
(
rule_key
(
account
,
name
),
-1
);
if
(
purple_prefs_exists
(
key
))
purple_prefs_set_string
(
key
,
"none"
);
g_free
(
key
);
}
static
void
list_ignore_rules
()
{
GString
*
string
;
GList
*
list
=
purple_prefs_get_string_list
(
PREF_ROOT
"/rules"
);
char
*
last
=
NULL
;
string
=
g_string_new
(
NULL
);
list
=
g_list_sort
(
list
,
(
GCompareFunc
)
g_utf8_collate
);
while
(
list
)
{
char
*
pref
=
list
->
data
;
const
char
*
rule
=
purple_prefs_get_string
(
pref
);
char
*
split
=
strrchr
(
pref
,
'/'
);
*
split
++
=
'\0'
;
if
(
rule
&&
*
rule
!=
'n'
)
{
if
(
last
==
NULL
||
g_ascii_strcasecmp
(
last
,
pref
))
{
g_free
(
last
);
last
=
g_strdup
(
pref
);
g_string_append_printf
(
string
,
"Ignore rules for %s<br>"
,
last
);
}
g_string_append_printf
(
string
,
"
\t
%s: %s<br>"
,
split
,
rule
);
}
g_free
(
list
->
data
);
list
=
g_list_delete_link
(
list
,
list
);
}
purple_notify_formatted
(
NULL
,
_
(
"Ignore Rules"
),
_
(
"The following are the current ignore rules"
),
NULL
,
*
string
->
str
?
string
->
str
:
_
(
"(Dear God! You are not ignoring any one!)"
),
NULL
,
NULL
);
g_string_free
(
string
,
TRUE
);
g_free
(
last
);
}
static
PurpleCmdRet
ignore_cmd
(
PurpleConversation
*
conv
,
const
char
*
cmd
,
char
**
arguments
,
char
**
error
,
gpointer
data
)
{
int
nargs
=
0
;
IgnoreContext
context
=
IGNORE_ALL
;
PurpleAccount
*
account
;
const
char
*
who
;
char
**
args
=
g_strsplit
(
arguments
[
0
],
" "
,
-1
);
if
(
args
==
NULL
)
{
list_ignore_rules
();
goto
end
;
}
if
(
strcmp
(
args
[
nargs
],
"-c"
)
==
0
)
{
nargs
++
;
context
=
IGNORE_CHAT
;
}
if
(
args
[
nargs
]
==
NULL
)
{
goto
end
;
}
#if 0
if (isdigit(args[nargs][0])) {
if (sscanf(args[nargs], "%d", &timer) == 1)
nargs++;
}
#endif
account
=
purple_conversation_get_account
(
conv
);
who
=
args
[
nargs
][
1
]
?
(
args
[
nargs
]
+
1
)
:
purple_conversation_get_name
(
conv
);
while
(
args
[
nargs
])
{
switch
(
args
[
nargs
][
0
])
{
case
'+'
:
add_ignore_rule
(
context
,
who
,
account
);
break
;
case
'-'
:
remove_ignore_rule_d
(
who
,
account
);
break
;
default
:
purple_debug_warning
(
"ignore"
,
"invalid command %s
\n
"
,
args
[
nargs
]);
break
;
}
nargs
++
;
}
end
:
g_strfreev
(
args
);
return
PURPLE_CMD_STATUS_OK
;
}
static
gboolean
is_ignored
(
const
char
*
name
,
PurpleAccount
*
account
,
PurpleConversationType
type
)
{
char
*
key
=
g_ascii_strdown
(
rule_key
(
account
,
name
),
-1
);
const
char
*
pref
=
NULL
;
if
(
!
purple_prefs_exists
(
key
))
{
g_free
(
key
);
return
FALSE
;
}
pref
=
purple_prefs_get_string
(
key
);
g_free
(
key
);
if
(
!
pref
)
return
FALSE
;
if
(
*
pref
==
'a'
)
{
purple_debug_info
(
"ignore"
,
"ignoring %s
\n
"
,
name
);
return
TRUE
;
}
if
(
*
pref
==
'c'
&&
type
==
PURPLE_CONV_TYPE_CHAT
)
{
purple_debug_info
(
"ignore"
,
"ignoring %s
\n
"
,
name
);
return
TRUE
;
}
return
FALSE
;
}
static
gboolean
receiving_msg
(
PurpleAccount
*
account
,
const
char
**
who
,
const
char
**
message
,
PurpleConversation
*
conv
,
PurpleMessageFlags
*
flags
,
PurpleConversationType
type
)
{
return
is_ignored
(
*
who
,
account
,
type
);
}
static
gboolean
chat_activity_cb
(
PurpleConversation
*
conv
,
const
char
*
user
,
PurpleConvChatBuddyFlags
flags
)
{
return
is_ignored
(
user
,
purple_conversation_get_account
(
conv
),
PURPLE_CONV_TYPE_CHAT
);
}
static
gboolean
plugin_load
(
PurplePlugin
*
plugin
)
{
cmd
=
purple_cmd_register
(
"ignore"
,
"s"
,
PURPLE_CMD_P_DEFAULT
,
PURPLE_CMD_FLAG_CHAT
|
PURPLE_CMD_FLAG_IM
|
PURPLE_CMD_FLAG_ALLOW_WRONG_ARGS
,
NULL
,
ignore_cmd
,
_
(
"ignore [-c] [+<ignore> -<unignore>]<br>\
Examples:<br>\
'ignore +StupidBot -NotABot'
\t
- (in a chat) Starts ignoring StupidBot, and removes NotABot from ignore list.<br>\
'ignore -c +AnotherBot'
\t
- (in a chat) Starts ignoring AnotherBot, but only in chats.<br>\
'ignore +'
\t
- (in an IM) Starts ignoring this person.<br>\
'ignore -'
\t
- (in an IM) Starts unignoring this person.<br>\
'ignore'
\t
- Lists the current ignore rules."
),
NULL
);
purple_signal_connect
(
purple_conversations_get_handle
(),
"chat-buddy-leaving"
,
plugin
,
G_CALLBACK
(
chat_activity_cb
),
NULL
);
purple_signal_connect
(
purple_conversations_get_handle
(),
"chat-buddy-joining"
,
plugin
,
G_CALLBACK
(
chat_activity_cb
),
NULL
);
purple_signal_connect
(
purple_conversations_get_handle
(),
"receiving-chat-msg"
,
plugin
,
G_CALLBACK
(
receiving_msg
),
GINT_TO_POINTER
(
PURPLE_CONV_TYPE_CHAT
));
purple_signal_connect
(
purple_conversations_get_handle
(),
"receiving-im-msg"
,
plugin
,
G_CALLBACK
(
receiving_msg
),
GINT_TO_POINTER
(
PURPLE_CONV_TYPE_IM
));
return
TRUE
;
}
static
gboolean
plugin_unload
(
PurplePlugin
*
plugin
)
{
purple_cmd_unregister
(
cmd
);
cmd
=
-1
;
return
TRUE
;
}
static
PurplePluginInfo
info
=
{
PURPLE_PLUGIN_MAGIC
,
PURPLE_MAJOR_VERSION
,
PURPLE_MINOR_VERSION
,
PURPLE_PLUGIN_STANDARD
,
NULL
,
0
,
NULL
,
PURPLE_PRIORITY_DEFAULT
,
"core-plugin_pack-ignore"
,
NULL
,
PP_VERSION
,
NULL
,
NULL
,
"Sadrul H Chowdhury <sadrul@users.sourceforge.net>"
,
PP_WEBSITE
,
plugin_load
,
plugin_unload
,
NULL
,
NULL
,
NULL
,
NULL
,
NULL
,
NULL
,
NULL
,
NULL
,
NULL
};
static
void
init_plugin
(
PurplePlugin
*
plugin
)
{
#ifdef ENABLE_NLS
bindtextdomain
(
GETTEXT_PACKAGE
,
PP_LOCALEDIR
);
bind_textdomain_codeset
(
GETTEXT_PACKAGE
,
"UTF-8"
);
#endif
/* ENABLE_NLS */
purple_prefs_add_none
(
PREF_ROOT
);
purple_prefs_add_string_list
(
PREF_ROOT
"/rules"
,
NULL
);
info
.
name
=
_
(
"Ignore"
);
info
.
summary
=
_
(
"Flexible plugin to selectively ignore people. Please do not use if you have amnesia."
);
info
.
description
=
_
(
"Flexible plugin to selectively ignore people. See '/help ignore' for more help.
\n
Please do not use if you have amnesia."
);
}
PURPLE_INIT_PLUGIN
(
ignore
,
init_plugin
,
info
)