1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131
|
# -*- coding: utf-8 -*-
#
# Copyright (c) 2010 by Alexander Schremmer <alex@alexanderweb.de>
#
# 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 3 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, see <http://www.gnu.org/licenses/>.
#
#
# (this script requires WeeChat 0.3.0 or newer)
#
# History:
# 2019-07-24, Sébastien Helleu <flashcode@flashtux.org>
# version 0.2.4: make script compatible with Python 3
# 2015-04-29, Colgate Minuette <rabbit@minuette.net>
# version 0.2.3: add option to send queued messages on /nick
# 2013-11-08, Stefan Huber <shuber@sthu.org>
# version 0.2.2: add match_prefix setting, recall timestamp of message
# 2012-12-29, Stefan Huber <shuber@sthu.org>
# version 0.2.1: fix channel determination in join_cb
# 2010-05-20, Alexander Schremmer <alex@alexanderweb.de>
# version 0.2: removed InfoList code
# 2010-05-15, Alexander Schremmer <alex@alexanderweb.de>
# version 0.1: initial release
import weechat as w
import re
from datetime import datetime
from time import strftime
SCRIPT_NAME = "postpone"
SCRIPT_AUTHOR = "Alexander Schremmer <alex@alexanderweb.de>"
SCRIPT_VERSION = "0.2.4"
SCRIPT_LICENSE = "GPL3"
SCRIPT_DESC = "Postpones written messages for later dispatching if target nick is not on channel"
postpone_data = {}
settings = {
'match_prefix': ('', 'Postpone message if prefix before "nick:" is matched. (Default: "")'),
'message_on_nick': ('off', 'Send message on /nick in addition to /join (Default: off)')
}
def send_messages(server, channel, nick):
buffer = w.buffer_search("", "%s.%s" % (server, channel))
messages = postpone_data[server][channel][nick]
for time, msg in messages:
tstr = strftime("%Y-%m-%d %H:%M:%S", time.timetuple())
w.command(buffer, msg + " (This message has been postponed on " + tstr + ".)")
messages[:] = []
def join_cb(data, signal, signal_data):
server = signal.split(',')[0] # EFNet,irc_in_JOIN
channel = re.match('.* JOIN :?(?P<channel>.+)$', signal_data).groups()[0]
nick = re.match(':(?P<nick>.+)!', signal_data).groups()[0].lower()
buffer = w.buffer_search("", "%s.%s" % (server, channel))
if server in postpone_data and channel in postpone_data[server] and\
nick in postpone_data[server][channel]:
send_messages(server, channel, nick)
return w.WEECHAT_RC_OK
def nick_cb(data, signal, signal_data):
if not w.config_is_set_plugin('message_on_nick'):
return w.WEECHAT_RC_OK
if not w.config_get_plugin('message_on_nick').lower() == "on":
return w.WEECHAT_RC_OK
server = signal.split(",")[0]
if server in postpone_data:
nick = signal_data.split(" ")[2]
if nick.startswith(":"):
nick = nick[1:]
nick = nick.lower()
for channel in postpone_data[server]:
if nick in postpone_data[server][channel]:
send_messages(server, channel, nick)
return w.WEECHAT_RC_OK
def channel_has_nick(server, channel, nick):
buffer = w.buffer_search("", "%s.%s" % (server, channel))
return bool(w.nicklist_search_nick(buffer, "", nick))
def command_run_input(data, buffer, command):
""" Function called when a command "/input xxxx" is run """
if command == "/input return": # As in enter was pressed.
input_s = w.buffer_get_string(buffer, 'input')
server = w.buffer_get_string(buffer, 'localvar_server')
channel = w.buffer_get_string(buffer, 'localvar_channel')
match_prefix = w.config_get_plugin('match_prefix')
match = re.match(match_prefix + r'([\w-]+?): (.*)$', input_s)
if match:
nick, message = match.groups()
if not channel_has_nick(server, channel, nick):
w.prnt(buffer, "| Enqueued message for %s: %s" % (nick, message))
save = datetime.now(), nick + ": " + message
postpone_data.setdefault(server, {}).setdefault(channel,
{}).setdefault(nick.lower(), []).append(save)
w.buffer_set(buffer, 'input', "")
# XXX why doesn't this work? i want to have the typed text
# in the history
#history_list = w.infolist_get("history", buffer, "")
#history_item = w.infolist_new_item(history_list)
#w.infolist_new_var_string(history_item, "text", input_s)
return w.WEECHAT_RC_OK
if w.register(SCRIPT_NAME, SCRIPT_AUTHOR, SCRIPT_VERSION, SCRIPT_LICENSE,
SCRIPT_DESC, "", ""):
version = w.info_get('version_number', '') or 0
for option, default_desc in settings.items():
if not w.config_is_set_plugin(option):
w.config_set_plugin(option, default_desc[0])
if int(version) >= 0x00030500:
w.config_set_desc_plugin(option, default_desc[1])
w.hook_command_run("/input return", "command_run_input", "")
w.hook_signal('*,irc_in2_join', 'join_cb', '')
w.hook_signal('*,irc_in2_nick', 'nick_cb', '')
|