mirror of
https://github.com/weechat/weechat.git
synced 2026-06-25 12:26:40 +02:00
Initial import
This commit is contained in:
@@ -0,0 +1,80 @@
|
||||
# --------------------------------------------------------------------
|
||||
#
|
||||
# Copyright (c) 2006 by Jean-Marie Favreau <jm@jmtrivial.info>
|
||||
#
|
||||
# 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 St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
#
|
||||
# --------------------------------------------------------------------
|
||||
# This script automatically op and voice some nicks
|
||||
# --------------------------------------------------------------------
|
||||
|
||||
|
||||
import weechat
|
||||
import re
|
||||
|
||||
|
||||
# regexp list for /op
|
||||
U_OP = { "server": { "#chan" : [ "nick1@domain.com", "nick2.*@.*"] } }
|
||||
|
||||
# chan list where all nicks are /voice
|
||||
C_VOICE = { "server": [ "#chan1", "#chan2" ] }
|
||||
|
||||
|
||||
def auto_op(server, args):
|
||||
'''Handle connect'''
|
||||
result = weechat.PLUGIN_RC_OK
|
||||
# first, watch if need /op
|
||||
if U_OP.has_key(server):
|
||||
chans = U_OP[server]
|
||||
try:
|
||||
# find nick and channel
|
||||
nothing, user, channel = args.split(":")
|
||||
nick, next = user.split("!")
|
||||
except ValueError:
|
||||
result = weechat.PLUGIN_RC_KO
|
||||
else:
|
||||
if chans.has_key(channel):
|
||||
users = chans[channel]
|
||||
for userExpr in users:
|
||||
if re.search("^n=" + userExpr, next):
|
||||
weechat.command("/op "+nick, channel, server) # op nick
|
||||
weechat.prnt("[op] "+nick+" on "+channel+"("+server+")") # print
|
||||
return result # exit
|
||||
|
||||
|
||||
# then watch if need /voice
|
||||
if C_VOICE.has_key(server):
|
||||
chans = C_VOICE[server]
|
||||
try:
|
||||
# find nick and channel
|
||||
nothing, user, channel = args.split(":")
|
||||
nick, next = user.split("!")
|
||||
except ValueError:
|
||||
result = weechat.PLUGIN_RC_KO
|
||||
else:
|
||||
if channel in chans:
|
||||
weechat.command("/voice "+nick, channel, server) # voice nick
|
||||
weechat.prnt("[voice] "+nick+" on "+channel+"("+server+")") # print info
|
||||
return result # exit
|
||||
|
||||
# otherwise: nothing to do
|
||||
return result
|
||||
|
||||
|
||||
# register and add function to weechat
|
||||
weechat.register("auto_op", "0.2", "", "auto op plug-in for weechat")
|
||||
weechat.add_message_handler ("join", "auto_op")
|
||||
|
||||
|
||||
@@ -0,0 +1,245 @@
|
||||
# -*- coding: iso-8859-1 -*-
|
||||
|
||||
# =============================================================================
|
||||
# autoauth.py (c) October 2005 by kolter <kolter+dev@openics.org>
|
||||
# Python script for WeeChat.
|
||||
#
|
||||
# Licence : GPL v2
|
||||
# Description : Permits to auto-authenticate when changing nick
|
||||
# Syntax : try /auth help to get help on this script
|
||||
#
|
||||
#
|
||||
# ### changelog ###
|
||||
#
|
||||
# * version 0.5
|
||||
# - fix bug when script script is run for first time
|
||||
# - rewrite half script to improve access to settings
|
||||
# - add a feature to permit to run command(s) when identified
|
||||
# - add completion for commands
|
||||
# * version 0.4
|
||||
# - use set_plugin_config and get_plugin_config to read ans save settings
|
||||
# - remove deprecated import
|
||||
# * version 0.3
|
||||
# - add return codes
|
||||
# * version 0.2
|
||||
# - correct weechatdir with weechat_dir while using weechat.get_info
|
||||
# * version 0.1 :
|
||||
# - first release
|
||||
#
|
||||
# =============================================================================
|
||||
|
||||
|
||||
VERSION="0.5"
|
||||
NAME="autoauth"
|
||||
|
||||
import weechat
|
||||
|
||||
weechat.register (NAME, VERSION, "", "Auto authentification while changing nick")
|
||||
weechat.add_message_handler("NOTICE", "auth_notice_check")
|
||||
weechat.add_command_handler(
|
||||
"auth",
|
||||
"auth_command",
|
||||
"Auto authentification while changing nick",
|
||||
"{ add $nick $pass [$server=current] | del $nick [$server=current] | list | cmd [$command [$server=current]] }",
|
||||
" add : add authorization for $nick with password $pass for $server\n"
|
||||
" del : del authorization for $nick for $server\n"
|
||||
" list : list all authorization settings\n"
|
||||
" cmd : command(s) (separated by '|') to run when identified for $server\n"
|
||||
" %n will be replaced by current nick in each command",
|
||||
"add|del|list|cmd %- %S %S"
|
||||
)
|
||||
|
||||
def auth_cmdlist():
|
||||
cmd = ''
|
||||
cmds = weechat.get_plugin_config("commands")
|
||||
if cmds == '':
|
||||
weechat.prnt("[%s] commands (empty)" % (NAME))
|
||||
else:
|
||||
weechat.prnt("[%s] commands (list)" % (NAME))
|
||||
for c in cmds.split("####"):
|
||||
weechat.prnt(" --> %s : '%s' " % (c.split(":::")[0], c.split(":::")[1]))
|
||||
|
||||
def auth_cmdget(server):
|
||||
cmd = ''
|
||||
cmds = weechat.get_plugin_config("commands")
|
||||
if cmds != '':
|
||||
for c in cmds.split("####"):
|
||||
if c.find(":::") != -1:
|
||||
if c.split(":::")[0] == server:
|
||||
cmd = ":::".join(c.split(":::")[1:])
|
||||
break
|
||||
return cmd
|
||||
|
||||
def auth_cmdset(server, command):
|
||||
cmds = weechat.get_plugin_config("commands")
|
||||
|
||||
found = False
|
||||
conf = []
|
||||
if cmds != '':
|
||||
for c in cmds.split("####"):
|
||||
if c.find(":::") != -1:
|
||||
if c.split(":::")[0] == server:
|
||||
found = True
|
||||
conf.append("%s:::%s" % (server, command))
|
||||
else:
|
||||
conf.append(c)
|
||||
if not found:
|
||||
conf.append("%s:::%s" % (server, command))
|
||||
|
||||
weechat.set_plugin_config("commands", "####".join(conf))
|
||||
weechat.prnt("[%s] command '%s' successfully added for server %s" % (NAME, command, server))
|
||||
|
||||
def auth_cmdunset(server):
|
||||
cmds = weechat.get_plugin_config("commands")
|
||||
|
||||
found = False
|
||||
conf = []
|
||||
if cmds != '':
|
||||
for c in cmds.split("####"):
|
||||
if c.find(":::") != -1:
|
||||
if c.split(":::")[0] != server:
|
||||
conf.append(c)
|
||||
else:
|
||||
found = True
|
||||
if found:
|
||||
weechat.prnt("[%s] command for server '%s' successfully removed" % (NAME, server))
|
||||
weechat.set_plugin_config("commands", "####".join(conf))
|
||||
|
||||
def auth_cmd(args, server):
|
||||
if server == '':
|
||||
if args == '':
|
||||
auth_cmdlist()
|
||||
else:
|
||||
weechat.prnt("[%s] error while setting command, can't find a server" % (NAME))
|
||||
else:
|
||||
if args == '':
|
||||
auth_cmdunset(server)
|
||||
else:
|
||||
auth_cmdset(server, args)
|
||||
|
||||
def auth_list():
|
||||
data = weechat.get_plugin_config("data")
|
||||
|
||||
if data == "":
|
||||
weechat.prnt("[%s] accounts (empty)" % (NAME))
|
||||
else:
|
||||
weechat.prnt("[%s] accounts (list)" % (NAME))
|
||||
for e in data.split(","):
|
||||
if e.find("=") == -1:
|
||||
continue
|
||||
(serv_nick, passwd) = e.split("=")
|
||||
(server, nick) = serv_nick.split(".")
|
||||
weechat.prnt(" --> %s@%s " % (nick, server))
|
||||
|
||||
def auth_notice_check(server, args):
|
||||
if args.find("If this is your nickname, type /msg NickServ") != -1 or args.find("This nickname is registered and protected.") != -1 :
|
||||
passwd = auth_get(weechat.get_info("nick"), server)
|
||||
if passwd != None:
|
||||
weechat.command("/quote nickserv identify %s" % (passwd), "", server)
|
||||
commands = auth_cmdget(server)
|
||||
if commands != '':
|
||||
for c in commands.split("|"):
|
||||
weechat.command(c.strip().replace("%n", weechat.get_info('nick')))
|
||||
|
||||
return weechat.PLUGIN_RC_OK
|
||||
|
||||
def auth_del(the_nick, the_server):
|
||||
data = weechat.get_plugin_config("data")
|
||||
|
||||
found = False
|
||||
conf = []
|
||||
for e in data.split(","):
|
||||
if e.find("=") == -1:
|
||||
continue
|
||||
(serv_nick, passwd) = e.split("=")
|
||||
(server, nick) = serv_nick.split(".")
|
||||
if the_nick == nick and the_server == server:
|
||||
found = True
|
||||
else:
|
||||
conf.append("%s.%s=%s" % (server, nick, passwd))
|
||||
|
||||
if found:
|
||||
weechat.set_plugin_config("data", ",".join(conf))
|
||||
weechat.prnt("[%s] nick '%s@%s' successfully remove" % (NAME, the_nick, the_server))
|
||||
else:
|
||||
weechat.prnt("[%s] an error occured while removing nick '%s@%s' (not found)" % (NAME, the_nick, the_server))
|
||||
|
||||
def auth_add(the_nick, the_passwd, the_server):
|
||||
data = weechat.get_plugin_config("data")
|
||||
|
||||
found = False
|
||||
conf = []
|
||||
for e in data.split(","):
|
||||
if e.find("=") == -1:
|
||||
continue
|
||||
(serv_nick, passwd) = e.split("=")
|
||||
(server, nick) = serv_nick.split(".")
|
||||
if the_nick == nick and the_server == server:
|
||||
passwd = the_passwd
|
||||
found = True
|
||||
conf.append("%s.%s=%s" % (server, nick, passwd))
|
||||
|
||||
if not found:
|
||||
conf.append("%s.%s=%s" % (the_server, the_nick, the_passwd))
|
||||
|
||||
weechat.set_plugin_config("data", ",".join(conf))
|
||||
weechat.prnt("[%s] nick '%s@%s' successfully added" % (NAME, the_nick, the_server))
|
||||
|
||||
def auth_get(the_nick, the_server):
|
||||
data = weechat.get_plugin_config("data")
|
||||
|
||||
for e in data.split(","):
|
||||
if e.find("=") == -1:
|
||||
continue
|
||||
(serv_nick, passwd) = e.split("=")
|
||||
(server, nick) = serv_nick.split(".")
|
||||
if the_nick == nick and the_server == server:
|
||||
return passwd
|
||||
return None
|
||||
|
||||
def auth_command(server, args):
|
||||
list_args = args.split(" ")
|
||||
|
||||
#strip spaces
|
||||
while '' in list_args:
|
||||
list_args.remove('')
|
||||
while ' ' in list_args:
|
||||
list_args.remove(' ')
|
||||
|
||||
if len(list_args) == 0:
|
||||
weechat.command("/help auth")
|
||||
elif list_args[0] not in ["add", "del", "list", "cmd"]:
|
||||
weechat.prnt("[%s] bad option while using /auth command, try '/help auth' for more info" % (NAME))
|
||||
elif list_args[0] == "cmd":
|
||||
if len(list_args[1:]) == 1 and list_args[1] in weechat.get_server_info().keys():
|
||||
auth_cmd("", list_args[1])
|
||||
elif len(list_args[1:]) == 1:
|
||||
auth_cmd(list_args[1], weechat.get_info('server'))
|
||||
elif len(list_args[1:]) >= 2:
|
||||
if list_args[-1] in weechat.get_server_info().keys():
|
||||
auth_cmd(" ".join(list_args[1:-1]), list_args[-1])
|
||||
else:
|
||||
auth_cmd(" ".join(list_args[1:]), weechat.get_info('server'))
|
||||
else:
|
||||
auth_cmd(" ".join(list_args[1:]), weechat.get_info(server))
|
||||
elif list_args[0] == "list":
|
||||
auth_list()
|
||||
elif list_args[0] == "add":
|
||||
if len(list_args) < 3 or (len(list_args) == 3 and weechat.get_info("server") == ''):
|
||||
weechat.prnt("[%s] bad option while using /auth command, try '/help auth' for more info" % (NAME))
|
||||
else:
|
||||
if len(list_args) == 3:
|
||||
auth_add(list_args[1], list_args[2], weechat.get_info("server"))
|
||||
else:
|
||||
auth_add(list_args[1], list_args[2], list_args[3])
|
||||
elif list_args[0] == "del":
|
||||
if len(list_args) < 2:
|
||||
weechat.prnt("[%s] bad option while using /auth command, try '/help auth' for more info" % (NAME))
|
||||
else:
|
||||
if len(list_args) == 2:
|
||||
auth_del(list_args[1], weechat.get_info("server"))
|
||||
else:
|
||||
auth_del(list_args[1], list_args[2])
|
||||
else:
|
||||
pass
|
||||
return weechat.PLUGIN_RC_OK
|
||||
@@ -0,0 +1,153 @@
|
||||
# --------------------------------------------------------------------
|
||||
#
|
||||
# Copyright (c) 2006 by Gwenn Gueguen <weechat@grumly.info>
|
||||
#
|
||||
# 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 St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
#
|
||||
# --------------------------------------------------------------------
|
||||
# This script automatically sets away after a period of inactivity
|
||||
# --------------------------------------------------------------------
|
||||
|
||||
|
||||
import weechat
|
||||
|
||||
|
||||
"""
|
||||
/autoaway [time [message]]
|
||||
|
||||
/autoaway whithout any parameter disables autoaway
|
||||
|
||||
Script config:
|
||||
time:
|
||||
number of minutes of inactivity after which a user will be marked as away
|
||||
message:
|
||||
message that will be passed to the /away command
|
||||
enabled:
|
||||
is autoaway enabled ?
|
||||
"""
|
||||
|
||||
|
||||
SCRIPT_NAME="autoaway"
|
||||
SCRIPT_VERSION="0.2"
|
||||
SCRIPT_DESC="autoaway script for weechat"
|
||||
|
||||
|
||||
# Names of the settings
|
||||
CONFIG_TIME="time"
|
||||
CONFIG_MESSAGE="message"
|
||||
CONFIG_ENABLED="enabled"
|
||||
|
||||
# Name of the command
|
||||
CMD_AUTOAWAY="autoaway"
|
||||
|
||||
# Default settings
|
||||
DEFAULT_TIME="15"
|
||||
DEFAULT_MESSAGE="idle"
|
||||
|
||||
# Interval (in seconds) between checks
|
||||
TIMER_VALUE=15
|
||||
|
||||
|
||||
def print_settings():
|
||||
weechat.prnt("AutoAway settings:")
|
||||
weechat.prnt(" time: %s minute(s)" % weechat.get_plugin_config(CONFIG_TIME))
|
||||
weechat.prnt(" message: %s" % weechat.get_plugin_config(CONFIG_MESSAGE))
|
||||
if weechat.get_plugin_config(CONFIG_ENABLED) == "true":
|
||||
weechat.prnt(" enabled")
|
||||
else:
|
||||
weechat.prnt(" disabled")
|
||||
|
||||
|
||||
def autoaway(server, args):
|
||||
weechat.remove_timer_handler("timer_handler")
|
||||
|
||||
params = args.split(None, 1)
|
||||
if len(params) == 0:
|
||||
weechat.set_plugin_config(CONFIG_ENABLED, "false")
|
||||
else:
|
||||
weechat.set_plugin_config(CONFIG_ENABLED, "true")
|
||||
weechat.set_plugin_config(CONFIG_TIME, params[0])
|
||||
if len(params) > 1:
|
||||
weechat.set_plugin_config(CONFIG_MESSAGE, params[1])
|
||||
|
||||
previous_inactivity = int(weechat.get_info("inactivity"))
|
||||
weechat.add_timer_handler(TIMER_VALUE, "timer_handler")
|
||||
|
||||
print_settings()
|
||||
|
||||
return weechat.PLUGIN_RC_OK
|
||||
|
||||
|
||||
def timer_handler():
|
||||
global previous_inactivity, previous_state
|
||||
|
||||
# Get current away status
|
||||
away_flag = int(weechat.get_info("away"))
|
||||
|
||||
# Get number of seconds of inactivity
|
||||
idle_time = int(weechat.get_info("inactivity"))
|
||||
|
||||
if away_flag == previous_state:
|
||||
# away flag was not changed outside this script
|
||||
if away_flag and idle_time < previous_inactivity:
|
||||
# Inactivity was reset (or overflowed ?)
|
||||
weechat.command("/away -all")
|
||||
elif not away_flag and idle_time >= (60 * int(weechat.get_plugin_config(CONFIG_TIME))):
|
||||
# Time to go away
|
||||
weechat.command("/away -all %s" % weechat.get_plugin_config(CONFIG_MESSAGE))
|
||||
|
||||
previous_state = int(weechat.get_info("away"))
|
||||
previous_inactivity = idle_time
|
||||
|
||||
return weechat.PLUGIN_RC_OK
|
||||
|
||||
|
||||
if weechat.register(SCRIPT_NAME, SCRIPT_VERSION, "", SCRIPT_DESC):
|
||||
|
||||
try:
|
||||
previous_state = int(weechat.get_info("away"))
|
||||
except ValueError:
|
||||
previous_state = 0
|
||||
|
||||
# Set config to default values if undefined
|
||||
try:
|
||||
idle_time = int(weechat.get_plugin_config(CONFIG_TIME))
|
||||
except ValueError:
|
||||
weechat.set_plugin_config(CONFIG_TIME, DEFAULT_TIME)
|
||||
|
||||
if weechat.get_plugin_config(CONFIG_MESSAGE) == None:
|
||||
weechat.set_plugin_config(CONFIG_MESSAGE, DEFAULT_MESSAGE)
|
||||
|
||||
if weechat.get_plugin_config(CONFIG_ENABLED) == None:
|
||||
weechat.set_plugin_config(CONFIG_ENABLED, "false")
|
||||
|
||||
|
||||
# Display a summary of the settings
|
||||
print_settings()
|
||||
|
||||
|
||||
# Start the timer if necessary
|
||||
if weechat.get_plugin_config(CONFIG_ENABLED) == "true":
|
||||
previous_inactivity = int(weechat.get_info("inactivity"))
|
||||
weechat.add_timer_handler(TIMER_VALUE, "timer_handler")
|
||||
|
||||
|
||||
weechat.add_command_handler(CMD_AUTOAWAY, "autoaway", "Set autoaway",
|
||||
"[time [message]]",
|
||||
"time: number of minutes before being marked as away\n"
|
||||
+ "message: away message\n"
|
||||
+ "\n"
|
||||
+ "whithout any argument, autoaway will be disabled\n")
|
||||
|
||||
@@ -0,0 +1,429 @@
|
||||
#!/usr/bin/env python
|
||||
"""
|
||||
Catapult by Stalwart <stlwrt@gmail.com>
|
||||
Licensed under GNU GPL 2
|
||||
"""
|
||||
|
||||
import weechat
|
||||
import random
|
||||
|
||||
weechat.register("Catapult", "0.1", "", "Less ordinary abuse generator")
|
||||
weechat.add_command_handler("slap", "slapper", "Creative slapper", "<target>", "", "%n")
|
||||
weechat.add_command_handler("fortune", "fortune", "Fortune cookies!")
|
||||
weechat.add_command_handler("winjoke", "winjoke", "Windoze jokes")
|
||||
weechat.add_command_handler("linjoke", "linjoke", "Linux jokes")
|
||||
weechat.add_command_handler("give", "giver", "Creative giver", "<target>", "", "%n")
|
||||
weechat.add_command_handler("hate", "hater", "Creative hater", "<target>", "", "%n")
|
||||
weechat.add_command_handler("love", "lover", "Creative lover", "<target>", "", "%n")
|
||||
weechat.add_command_handler("dance", "dancer", "Creative dancer", "<target>", "", "%n")
|
||||
|
||||
# slapper
|
||||
def slapper(server, args):
|
||||
objects = [
|
||||
"a rather large squid",
|
||||
"a hydraulic pump",
|
||||
"a book by Stephen King",
|
||||
"a 10mbit network card",
|
||||
"a ladies handbag",
|
||||
"some girl scouts",
|
||||
"a football team",
|
||||
"a bottle",
|
||||
"a yellow marshmellow",
|
||||
"a match",
|
||||
"the queen of England",
|
||||
"a taxi",
|
||||
"100 feet of wire",
|
||||
"a bag of Cheerios",
|
||||
"a hat",
|
||||
"a fist",
|
||||
"the back hand",
|
||||
"with the forehead",
|
||||
"a computer moniter",
|
||||
"a coconut",
|
||||
"a microfone",
|
||||
"a cellphone",
|
||||
"a snowplough",
|
||||
"a doggy",
|
||||
"Bill Clinton",
|
||||
"a stone",
|
||||
"a club. With a nail in it",
|
||||
"a small asteroid, rich in iron",
|
||||
"a small interstellar spaceship",
|
||||
"a fresh zuccini",
|
||||
"a laptop",
|
||||
"a big dictionary",
|
||||
"a baseball bat",
|
||||
"NeverNet",
|
||||
"some porn",
|
||||
"a mIRC script",
|
||||
"a canoe",
|
||||
"a tortoise",
|
||||
"a horse",
|
||||
"the book of Kells",
|
||||
"a whale",
|
||||
"a rubber dildo",
|
||||
"a well groomed poodle",
|
||||
"a channel operator",
|
||||
"a news paper (New York Times Sunday Edition)",
|
||||
"a gnarly werewolf",
|
||||
"a vampire. They really suck",
|
||||
"a perl script",
|
||||
"a bag of doggie chow",
|
||||
"a fat walrus",
|
||||
"an IP adress",
|
||||
"a catholic priest",
|
||||
"James Dean",
|
||||
"Ronald MacDonald (he *IS* good for something)",
|
||||
"Autoconf version 2.13",
|
||||
"a PRIVMSG",
|
||||
"an email adress",
|
||||
"some ANSI color codes",
|
||||
"a thermonuclear weapon. Yehaw",
|
||||
"the hitch hikers guide to the galaxy, revised edition",
|
||||
"Nessie, the Loch Ness monster",
|
||||
"a tuna. Still in the can! *BONK* That will leave a mark",
|
||||
"a few fluffy pillows",
|
||||
"a red chinese dragon",
|
||||
"a linux-manual (signed by L. Torvalds)",
|
||||
"Stage1",
|
||||
"Bill Gates underpants",
|
||||
"GM Abraham and the whole OW-Staff",
|
||||
"Sphere 1.0",
|
||||
"a Linuxkernel",
|
||||
"Lenin's Collected Works",
|
||||
"Stalin's Collected Works",
|
||||
"a iron Tux",
|
||||
"a glowing 23",
|
||||
"your mum (CLEAN YOUR ROOM!)",
|
||||
"a complete GNOME-Documentation",
|
||||
"a Portagetree",
|
||||
"thand[Z]'s transparent Tanga",
|
||||
"a Kernelpanic",
|
||||
"Windoze XP",
|
||||
"an AK-47 (die, you imperialist dog!)",
|
||||
"a bag full with Michael Jacksons droped noses",
|
||||
"an NBP-Manifesto (Hail Limonew! Hail our Leader! Hail!)",
|
||||
"an NBP-Flag (Lead us to freedom, Leader Limonew!)",
|
||||
"Mein Kampf (Doppelausgabe, Hardcover)",
|
||||
"Invader Zim's iron fist",
|
||||
"some ASCII-Arts",
|
||||
"The Family Learning Channel",
|
||||
"GOD",
|
||||
"Dorian Grey's picture",
|
||||
"some unlocked Grenades *BOOM*",
|
||||
"the Win2k Buglist",
|
||||
"a widescreen TV (it can damage your brain!)",
|
||||
"a chain saw",
|
||||
"a huge tree"
|
||||
]
|
||||
if args <> "":
|
||||
weechat.command("/me slaps %s with %s." % (args, random.choice(objects)))
|
||||
return weechat.PLUGIN_RC_OK
|
||||
else:
|
||||
weechat.prnt("You must specify target")
|
||||
return weechat.PLUGIN_RC_KO
|
||||
|
||||
# fortune cookies
|
||||
def fortune(server, args):
|
||||
objects = [
|
||||
"There are three kinds of people: men, women, and unix.",
|
||||
"BOFH Excuse #118: the router thinks its a printer.",
|
||||
"CHUBBY CHECKER just had a CHICKEN SANDWICH in downtown DULUTH!",
|
||||
"Think big. Pollute the Mississippi.",
|
||||
"An optimist is a man who looks forward to marriage. A pessimist is a married optimist.",
|
||||
"There are never any bugs you haven't found yet.",
|
||||
"It don't mean a THING if you ain't got that SWING!!",
|
||||
"Atomic batteries to power, turbines to speed. -- Robin, The Boy Wonder",
|
||||
"Two wrongs don't make a right, but three lefts do.",
|
||||
"A log may float in a river, but that does not make it a crocodile.",
|
||||
"Art is Nature speeded up and God slowed down. -- Chazal",
|
||||
"Texas law forbids anyone to have a pair of pliers in his possession.",
|
||||
"UFOs are for real: the Air Force doesn't exist.",
|
||||
"Expansion means complexity; and complexity decay.",
|
||||
"I came, I saw, I deleted all your files.",
|
||||
"The Magic of Windows: Turns a 486 back into a PC/XT.",
|
||||
"Our vision is to speed up time, eventually eliminating it. -- Alex Schure",
|
||||
"Breaking Windows isn't just for kids anymore...",
|
||||
"Neckties strangle clear thinking. -- Lin Yutang",
|
||||
"I'm prepared for all emergencies but totally unprepared for everyday life.",
|
||||
"Yow! I just went below the poverty line!",
|
||||
"Break into jail and claim police brutality.",
|
||||
"BOFH Excuse #290: The CPU has shifted, and become decentralized.",
|
||||
"Did you hear about the model who sat on a broken bottle and cut a nice figure?",
|
||||
"We have a equal opportunity Calculus class -- it's fully integrated.",
|
||||
"BOFH Excuse #170: popper unable to process jumbo kernel",
|
||||
"It's later than you think.",
|
||||
"My Aunt MAUREEN was a military advisor to IKE & TINA TURNER!!",
|
||||
"Everyone hates me because I'm paranoid.",
|
||||
"When you are in it up to your ears, keep your mouth shut.",
|
||||
"Theory is gray, but the golden tree of life is green. -- Goethe",
|
||||
"Most Texans think Hanukkah is some sort of duck call. -- Richard Lewis",
|
||||
"grasshopotomaus: A creature that can leap to tremendous heights... once.",
|
||||
"It takes both a weapon, and two people, to commit a murder.",
|
||||
"Facts are the enemy of truth. -- Don Quixote",
|
||||
"Forty two.",
|
||||
"BOFH Excuse #424: operation failed because: there is no message for this error (#1014)",
|
||||
"Never leave anything to chance; make sure all your crimes are premeditated.",
|
||||
"BOFH Excuse #60: system has been recalled",
|
||||
"Science and religion are in full accord but science and faith are in complete discord.",
|
||||
"A likely impossibility is always preferable to an unconvincing possibility. -- Aristotle",
|
||||
"The angry man always thinks he can do more than he can. -- Albertano of Brescia",
|
||||
"Hello again, Peabody here... -- Mister Peabody",
|
||||
"Nobody ever died from oven crude poisoning.",
|
||||
"Dogs crawl under fences... software crawls under Windows 95.",
|
||||
"Say something you'll be sorry for, I love receiving apologies.",
|
||||
"NOTICE: -- THE ELEVATORS WILL BE OUT OF ORDER TODAY -- (The nearest working elevator is in the building across the street.)",
|
||||
"THERE ARE PLENTY OF BUSINESSES LIKE SHOW BUSINESS -- Bart Simpson on chalkboard in episode 1F19",
|
||||
"Life is what happens to you while you're busy making other plans. -- John Lennon, Beautiful Boy",
|
||||
"While having never invented a sin, I'm trying to perfect several.",
|
||||
"Emacs, n.: A slow-moving parody of a text editor.",
|
||||
" ... with liberty and justice for all ... who can afford it.",
|
||||
"Princess Leia: Aren't you a little short for a stormtrooper?",
|
||||
"The Official Colorado State Vegetable is now the 'state legislator'",
|
||||
"Abandon the search for Truth; settle for a good fantasy.",
|
||||
"There's nothing to writing. All you do is sit at a typewriter and open a vein. -- Red Smith",
|
||||
"Our OS who art in CPU, UNIX be thy name. Thy programs run, thy syscalls done, In kernel as it is in user!",
|
||||
"All hope abandon, ye who enter here! -- Dante Alighieri",
|
||||
"The human mind ordinarily operates at only ten percent of its capacity -- the rest is overhead for the operating system.",
|
||||
"Professor: 'If a dog craps anywhere in the universe, you can bet I won't be out of loop.'",
|
||||
"I WILL NOT MAKE FLATUENT NOISES IN CLASS -- Bart Simpson on chalkboard in episode 7F13",
|
||||
"Listen you donkey raping shit eater.",
|
||||
"In specifications, Murphy's Law supersedes Ohm's.",
|
||||
"One of Bender's kids: Our dad is a giant toy!",
|
||||
"I am a jelly donut. I am a jelly donut.",
|
||||
"We are all in the gutter, but some of us are looking at the stars. -- Oscar Wilde",
|
||||
"Bender to Zoidberg: 'You're looking less nuts, crabby.'",
|
||||
"Things will be bright in P.M. A cop will shine a light in your face.",
|
||||
"A journey of a thousand miles begins with a cash advance.",
|
||||
"Everything that can be invented has been invented. -- Charles Duell, Director of U.S. Patent Office, 1899",
|
||||
"Vote anarchist.",
|
||||
"paranoia, n.: A healthy understanding of the way the universe works.",
|
||||
"BOFH Excuse #401: Sales staff sold a product we don't offer.",
|
||||
"BOFH Excuse #200: The monitor needs another box of pixels.",
|
||||
"The important thing is not to stop questioning.",
|
||||
"Not all men who drink are poets. Some of us drink because we aren't poets.",
|
||||
"Oh my god, dude!",
|
||||
"BOFH Excuse #441: Hash table has woodworm",
|
||||
"BOFH Excuse #112: The monitor is plugged into the serial port",
|
||||
"There's so much to say but your eyes keep interrupting me.",
|
||||
"For the next hour, WE will control all that you see and hear.",
|
||||
"Reality continues to ruin my life. -- Calvin",
|
||||
"The shortest distance between two points is under construction. -- Noelie Alito",
|
||||
"BOFH Excuse #192: runaway cat on system.",
|
||||
"My haircut is totally traditional!",
|
||||
"You! What PLANET is this! -- McCoy, 'The City on the Edge of Forever', stardate 3134.0",
|
||||
"BOFH Excuse #433: error: one bad user found in front of screen",
|
||||
"Dyslexics have more fnu.",
|
||||
"I'm not stupid, I'm not expendable, and I'M NOT GOING!",
|
||||
"It's clever, but is it art?",
|
||||
"His life was formal; his actions seemed ruled with a ruler.",
|
||||
"Yeah. Except for being entirely different, they're pretty much the same.",
|
||||
"Oh, I get it!! 'The BEACH goes on', huh, SONNY??",
|
||||
"Ban the bomb. Save the world for conventional warfare.",
|
||||
"Everything that you know is wrong, but you can be straightened out.",
|
||||
"If I pull this SWITCH I'll be RITA HAYWORTH!! Or a SCIENTOLOGIST!",
|
||||
"Tex SEX! The HOME of WHEELS! The dripping of COFFEE!! Take me to Minnesota but don't EMBARRASS me!!",
|
||||
"clovek, ktory si ako prvy kupil fax musel byt strasny kokot.",
|
||||
"Are you a turtle?",
|
||||
"You will be the last person to buy a Chrysler.",
|
||||
"If in doubt, mumble.",
|
||||
"Nice guys don't finish nice.",
|
||||
"You cannot use your friends and have them too.",
|
||||
"Microsoft is to Software as McDonalds is to Cuisine.",
|
||||
"panic: can't find /",
|
||||
"I used to be an agnostic, but now I'm not so sure.",
|
||||
"May your SO always know when you need a hug.",
|
||||
"We are MicroSoft. You will be assimilated. Resistance is futile. (Attributed to B.G., Gill Bates)",
|
||||
"Life is a whim of several billion cells to be you for a while.",
|
||||
"BOFH Excuse #347: The rubber band broke",
|
||||
"Death has been proven to be 99% fatal in laboratory rats.",
|
||||
"There are only two kinds of tequila. Good and better.",
|
||||
"C for yourself.",
|
||||
"Tact, n.: The unsaid part of what you're thinking.",
|
||||
"Shit Happens."
|
||||
]
|
||||
weechat.command(("Wanda the Fish says: %s") % random.choice(objects))
|
||||
return weechat.PLUGIN_RC_OK
|
||||
|
||||
# winjoke
|
||||
def winjoke(server, args):
|
||||
objects = [
|
||||
"Windows NT, from the people who invented EDLIN!",
|
||||
"Windows: Microsoft's tax on computer illiterates.",
|
||||
"The nice thing about Windows is - It does not just crash, it displays a dialog box and lets you press 'OK' first.",
|
||||
"Why use Windows, since there is a door?",
|
||||
"In a world without fences who needs Gates?",
|
||||
"Another name for a Windows tutorial is crash course!",
|
||||
"Failure is not an option -- it comes bundled with Windows.",
|
||||
"NT... the last two letters of bowel movement",
|
||||
"Some software money can't buy. For everything else there's Micros~1.",
|
||||
"Sticks and Stones may break my bones but FUD will never concern me.",
|
||||
"Every program expands until it can send mail. ...Except Exchange. ",
|
||||
"Microsoft: 'You've got questions. We've got dancing paperclips.'",
|
||||
".vbs = Virus Bearing Script?",
|
||||
"Technology is positive when the creators put the interests of their users before their bottom line.",
|
||||
"Have you ever noticed that at trade shows Microsoft is always the one giving away stress balls?",
|
||||
"Do you remember when you only had to pay for windows when *you* broke them? (Submitted by Noel Maddy)",
|
||||
"National Weather Service advice for those threatened by severe thunderstorms: 'Go inside a sturdy building and stay away from WINDOWS!' (Submitted by Ben Bullock)",
|
||||
"Microsoft is to Software as McDonalds is to Cuisine.",
|
||||
"Microsoft should switch to the vacuum cleaner business where people actually want products that suck. (Submitted by Bruno Bratti)",
|
||||
"Everyone seems so impatient and angry these days. I think it's because so many people use Windows at work -- do you think you'd be Politeness Man after working on Windows 8 hrs. or more? (Submitted by Chip Atkinson)",
|
||||
"NT 5.0 so vaporous it's in danger of being added to the periodic table as a noble gas. (Spotted in a Slashdot discussion)",
|
||||
"My Beowulf cluster will beat your Windows NT network any day. (Submitted by wbogardt[at]gte.net)",
|
||||
"It's no wonder they call it WinNT; WNT = VMS++; (Submitted by Chris Abbey)",
|
||||
"Double your disk space - delete Windows! (Submitted by Albert Dorofeev)",
|
||||
"The Edsel. New Coke. Windows 2000. All mandatory case studies for bizschool students in 2020. (From a LinuxToday post by Bear Giles)",
|
||||
"I will never trust someone called GATES that sells WINDOWS. (Submitted by Federico Roman)",
|
||||
"'Microsoft technology' -- isn't that an oxymoron?",
|
||||
"MCSE == Mentally Challenged Slave of the Empire.",
|
||||
"Windows NT -- it'll drive you buggy!",
|
||||
"Where do you want to go today? Don't ask Microsoft for directions.",
|
||||
"MS and Y2K: Windows 95, 98, ... and back again to 01",
|
||||
"There's the light at the end of the the Windows.",
|
||||
"People use dummies for crash-tests. Windows is so difficult they had to educate the dummies first -- by giving them 'Windows for Dummies' books!",
|
||||
"Windows: The first user interface where you click Start to turn it off.",
|
||||
"NT == No Thanks",
|
||||
"With Windows Millennium, Microsoft was able to get the boot time down to 25 seconds. That's almost as short as it's uptime.",
|
||||
"Windows 2000: Designed for the Internet. The Internet: Designed for UNIX.",
|
||||
"MCSE = Minesweeper Consultant, Solitaire Expert",
|
||||
"MCSE = Meaningless Certificate, Software Expired",
|
||||
"I'm not a programmer, but I play one at Microsoft.",
|
||||
"Microsoft Zen - Become one with the blue screen.",
|
||||
"The next hot technology from Microsoft will be object-oriented assembly."
|
||||
]
|
||||
weechat.command(("Wanda the Fish says: %s") % random.choice(objects))
|
||||
return weechat.PLUGIN_RC_OK
|
||||
|
||||
# linjoke
|
||||
def linjoke(server, args):
|
||||
objects = [
|
||||
"Got Linux?",
|
||||
"Microsoft gives you Windows... Linux gives you the whole house.",
|
||||
"Linux, DOS, Windows NT -- The Good, the Bad, and the Ugly",
|
||||
"Linux: the operating system with a CLUE... Command Line User Environment",
|
||||
"If Bill Gates is the Devil then Linus Torvalds must be the Messiah.",
|
||||
"Linux. Where do you want to go tomorrow?",
|
||||
"Linux: The choice of a GNU generation",
|
||||
"When you say I wrote a program that crashed Windows, people just stare at you blankly and say Hey, I got those with the system, *for free*. -- Linus Torvalds",
|
||||
"We all know Linux is great...it does infinite loops in 5 seconds. -- Linus Torvalds",
|
||||
"Some people have told me they dont think a fat penguin really embodies the grace of Linux, which just tells me they have never seen a angry penguin charging at them in excess of 100mph. Theyd be a lot more careful about what they say if they had. -- Linus Torvalds",
|
||||
"Veni, vidi, Linux!",
|
||||
"Type cat vmlinuz > /dev/audio to hear the Voice of God.",
|
||||
"Linux: Because a PC is a terrible thing to waste.",
|
||||
"Linux: Because rebooting is for adding new hardware",
|
||||
"We are Linux. Resistance is measured in Ohms.",
|
||||
"Free Software: the Software by the People, of the People and for the People. Develop! Share! Enhance! and Enjoy! (Submitted by Andy Tai)",
|
||||
"Get it up, keep it up... LINUX: Viagra for the PC. (Submitted by Chris Abbey)",
|
||||
"Peace, Love and Compile the kernel.... (Submitted by Justin L. Herreman)",
|
||||
"Free your software, and your ass will follow",
|
||||
"Reset button? Which reset button? - Linux, the OS that never sleeps.",
|
||||
"Linux: Where do you want to GO... Oh, Im already there!",
|
||||
"Windows contains FAT. Use Linux -- you wont ever have to worry about your weight.",
|
||||
"Oh My God! They Killed init! You Bastards!",
|
||||
"Unix: Where /sbin/init is still Job 1."
|
||||
]
|
||||
weechat.command(("Wanda the Fish says: %s") % random.choice(objects))
|
||||
return weechat.PLUGIN_RC_OK
|
||||
|
||||
# giver
|
||||
def giver(server, args):
|
||||
objects = [
|
||||
"a binary four",
|
||||
"a nice cup of SHUT THE FUCK UP",
|
||||
"an asskick",
|
||||
"a sign: 'Please kill yourself'",
|
||||
"a sign: 'Please go home now'",
|
||||
"an unlocked Grenade *tick tick BOOM*",
|
||||
"a gun - do it for mankind!"
|
||||
|
||||
]
|
||||
if args <> "":
|
||||
weechat.command("/me gives %s %s." % (args, random.choice(objects)))
|
||||
return weechat.PLUGIN_RC_OK
|
||||
else:
|
||||
weechat.prnt("You must specify target")
|
||||
return weechat.PLUGIN_RC_KO
|
||||
|
||||
# hater
|
||||
def hater(server, args):
|
||||
objects = [
|
||||
"so much, that he spits hellfire",
|
||||
"so much, that he want's to shoot someone",
|
||||
"SOOOO MUUUUCH!!!"
|
||||
|
||||
]
|
||||
if args <> "":
|
||||
weechat.command("/me hates %s %s." % (args, random.choice(objects)))
|
||||
return weechat.PLUGIN_RC_OK
|
||||
else:
|
||||
weechat.prnt("You must specify target")
|
||||
return weechat.PLUGIN_RC_KO
|
||||
|
||||
# lover
|
||||
def lover(server, args):
|
||||
actions = [
|
||||
"a *mwah*",
|
||||
"a wet kiss",
|
||||
"a tight and long hug",
|
||||
"an ass-squeeze",
|
||||
"a tight hug",
|
||||
"a wet kiss",
|
||||
"a nice, tight hug",
|
||||
"a kiss on the cheek",
|
||||
"a wet, french kiss",
|
||||
"a kiss",
|
||||
"a hug",
|
||||
"sex",
|
||||
"sweet romance",
|
||||
"some groping",
|
||||
"bed actions",
|
||||
"oral sex",
|
||||
"a porn-tape",
|
||||
"anal love",
|
||||
]
|
||||
if args <> "":
|
||||
weechat.command("/me cheers %s with %s.." % (args, random.choice(actions)))
|
||||
return weechat.PLUGIN_RC_OK
|
||||
else:
|
||||
weechat.prnt("You must specify target")
|
||||
return weechat.PLUGIN_RC_KO
|
||||
|
||||
# dancer
|
||||
def dancer(server, args):
|
||||
objects = [
|
||||
"used condoms",
|
||||
"condoms",
|
||||
"used tampons",
|
||||
"tampons",
|
||||
"roses",
|
||||
"rosebuds",
|
||||
"rice",
|
||||
"uncooked rice",
|
||||
"bananas",
|
||||
"little pieces of paper with the text *YAY!* on",
|
||||
"little pieces of paper with the text *w00t!* on",
|
||||
"little pieces of paper with the text *WOOHOO!* on",
|
||||
"little pieces of paper with the text *Kiss my cheek!* on",
|
||||
"coconuts with faces on",
|
||||
"little pieces of paper with the text *LOVE ROCKS!* on",
|
||||
"little pieces of paper with the text *LETS HAVE SEX!* on",
|
||||
"little pieces of paper with the text *GOD BLESS AMERICA!* on",
|
||||
"balloons with faces on",
|
||||
"balloons",
|
||||
"chocolate cakes",
|
||||
"english teachers",
|
||||
"pr0n magazines",
|
||||
"vietnamese kids",
|
||||
"snowballs",
|
||||
"rocks",
|
||||
"Michael Jackson (naked)",
|
||||
"unlocked Grenades *BOOM*",
|
||||
"Nine Inch Nails",
|
||||
"Bodyparts (bloody, wet & sexy)",
|
||||
]
|
||||
if args <> "":
|
||||
weechat.command("/me dances around %s throwing %s.." % (args, random.choice(objects)))
|
||||
return weechat.PLUGIN_RC_OK
|
||||
else:
|
||||
weechat.prnt("You must specify target")
|
||||
return weechat.PLUGIN_RC_KO
|
||||
@@ -0,0 +1,156 @@
|
||||
"""
|
||||
:Author: Henning Hasemann <hhasemann [at] web [dot] de>
|
||||
:Updated: Daga <daga [at] daga [dot] dyndns [dot] org>
|
||||
|
||||
:What it does:
|
||||
With this script you can configure weechat
|
||||
to give custom responses to CTCP-Requests.
|
||||
|
||||
:Usage:
|
||||
Load this file somehow.
|
||||
You can configure replies to CTCP-requests
|
||||
with the /set_ctcp - command. (examples below)
|
||||
|
||||
Released under GPL license.
|
||||
|
||||
Hope you enjoy it :-)
|
||||
-- Henning aka asmanian
|
||||
"""
|
||||
|
||||
version = "0.8"
|
||||
history = """
|
||||
0.1 initial
|
||||
0.2
|
||||
- now displays a "CTCP FOOBAR received from ..."
|
||||
0.3
|
||||
- now /help set_ctcp is available
|
||||
0.4
|
||||
- corrected a few typos
|
||||
- made special variables (e.g. version) easier to use
|
||||
0.5
|
||||
- removed debugging messages
|
||||
0.6
|
||||
- bugfix (sometimes /set_ctcp did not work)
|
||||
0.7 (Daga)
|
||||
- added multi-server support
|
||||
0.8
|
||||
- fixed on_msg (occasionally caused a minor fault)
|
||||
"""
|
||||
|
||||
short_syntax = """[REQUEST ANSWER]"""
|
||||
|
||||
syntax = """ Examples:
|
||||
|
||||
/set_ctcp
|
||||
show settings for common CTCP-Requests.
|
||||
where "OFF" means "use weechat default behaviour.
|
||||
|
||||
/set_ctcp VERSION I prefer using weechat $version
|
||||
Reply with a fancy message.
|
||||
$version is substituted with weechats version.
|
||||
Other variables are: $away, $nick and $server.
|
||||
(If you find something else that could make sense
|
||||
here, let me know!)
|
||||
|
||||
/set_ctcp HOW_ARE_YOU Good.
|
||||
Set answer to a rather unusual CTCP-request.
|
||||
|
||||
/set_ctcp VERSION OFF
|
||||
Disable special behavior when CTCP VERSION comes in.
|
||||
atm this leaves an entry in plugins.rc which
|
||||
can be safely removed.
|
||||
"""
|
||||
|
||||
|
||||
import weechat as wc
|
||||
import re
|
||||
|
||||
wc.register("ctcp", version, "", "Customize CTCP replies")
|
||||
wc.add_command_handler("set_ctcp", "set", "", short_syntax, syntax)
|
||||
wc.add_message_handler("privmsg", "on_msg")
|
||||
|
||||
if not wc.get_plugin_config("requests"):
|
||||
wc.set_plugin_config("requests", " ".join(["VERSION", "USERINFO", "FINGER", "TIME", "PING"]))
|
||||
|
||||
def get_answers():
|
||||
# Strangely, get_plugin_config sometimes returns
|
||||
# the integer 0
|
||||
requests = wc.get_plugin_config("requests")
|
||||
if requests:
|
||||
requests = requests.split()
|
||||
else:
|
||||
requests = ["VERSION", "USERINFO", "FINGER", "TIME", "PING"]
|
||||
|
||||
d = {}
|
||||
for r in requests:
|
||||
d[r] = wc.get_plugin_config("CTCP_" + r)
|
||||
return d
|
||||
|
||||
def set_answer(k, v):
|
||||
wc.set_plugin_config("CTCP_" + k, v)
|
||||
requests = wc.get_plugin_config("requests").split()
|
||||
if k.upper() not in requests:
|
||||
requests.append(k.upper())
|
||||
wc.set_plugin_config("requests", " ".join(requests))
|
||||
|
||||
def show_syntax():
|
||||
wc.prnt("usage: /set_ctcp %s" % short_syntax)
|
||||
wc.prnt("(For more information type /help set_ctcp)")
|
||||
|
||||
def on_msg(server, args):
|
||||
nothing, info, message = args.split(":", 2)
|
||||
hostmask = info.split(None, 2)[0]
|
||||
source = hostmask.split("!")[0]
|
||||
|
||||
answers = get_answers()
|
||||
|
||||
try:
|
||||
if message.startswith("\x01") and message.endswith("\x01"):
|
||||
req = message[1:-1]
|
||||
ans = answers[req]
|
||||
if not ans or ans == "OFF":
|
||||
raise ValueError
|
||||
|
||||
info = {
|
||||
"version": wc.get_info("version"),
|
||||
"nick": wc.get_info("nick"),
|
||||
"away": wc.get_info("away") and "away" or "there",
|
||||
"server": server,
|
||||
}
|
||||
|
||||
while True:
|
||||
match = re.search(r'[^\\]\$([a-z]+)\b', ans) #, r'--\1--', ans)
|
||||
if match is None: break
|
||||
else:
|
||||
l, r = match.span()
|
||||
ans = ans[:l+1] + info.get(match.group(1), "$" + match.group(1)) + ans[r:]
|
||||
|
||||
wc.prnt("CTCP %s received from %s (on %s)" % (req, source, server))
|
||||
wc.command("/quote NOTICE %s :\x01%s %s\x01" % (
|
||||
source, req, ans), "", server)
|
||||
return wc.PLUGIN_RC_OK_IGNORE_ALL
|
||||
|
||||
except Exception, e:
|
||||
pass
|
||||
|
||||
return wc.PLUGIN_RC_OK
|
||||
|
||||
def set(server, args):
|
||||
try:
|
||||
argv = args.split(None, 1)
|
||||
answers = get_answers()
|
||||
|
||||
if not len(argv):
|
||||
for k, v in answers.items():
|
||||
wc.prnt("%10s: %s" % (k, v or "OFF"))
|
||||
|
||||
elif len(argv) == 2:
|
||||
set_answer(argv[0], argv[1])
|
||||
|
||||
else:
|
||||
show_syntax()
|
||||
except Exception, e:
|
||||
pass
|
||||
|
||||
return wc.PLUGIN_RC_OK
|
||||
|
||||
@@ -0,0 +1,99 @@
|
||||
# -*- coding: iso-8859-15 -*-
|
||||
|
||||
"""
|
||||
:Author: Henning Hasemann <hhasemann [at] web [dot] de>
|
||||
|
||||
Usage:
|
||||
|
||||
- Load this plugin
|
||||
- In a channel or query type "/flip foo something" to
|
||||
send the reversed text "gnihtemos oof"
|
||||
- In a channel or query type "/leet something else" to
|
||||
send the h4x02-5r!pT - Version of your text.
|
||||
(Please use with caution such crap is discouraged in most channels)
|
||||
|
||||
Released under GPL licence.
|
||||
"""
|
||||
|
||||
__version__ = "0.1"
|
||||
__history__ = """
|
||||
0.1 initial
|
||||
"""
|
||||
|
||||
short_syntax = """TEXT"""
|
||||
syntax_flip = """ Example:
|
||||
|
||||
/flip foo bar
|
||||
sends "rab oof" to the channel
|
||||
"""
|
||||
syntax_leet = """ Example:
|
||||
|
||||
/leet eleet
|
||||
sends "31337" (or similar) to the channel
|
||||
"""
|
||||
|
||||
import weechat as wc
|
||||
import string, random
|
||||
|
||||
wc.register("gimmicks", __version__, "", "string gimmicks")
|
||||
wc.add_command_handler("flip", "flip", "", short_syntax, syntax_flip)
|
||||
wc.add_command_handler("leet", "leet", "", short_syntax, syntax_leet)
|
||||
|
||||
leet_dict = {
|
||||
"e": ["3"],
|
||||
"l": ["1", "!", "|"],
|
||||
"r": ["|2"],
|
||||
"b": ["8"],
|
||||
"v": [r'\/'],
|
||||
"t": ["7"],
|
||||
"i": ["!"],
|
||||
"w": [r'\/\/', 'vv'],
|
||||
"a": ["/\\", "<|", "4"],
|
||||
"k": ["x"],
|
||||
"n": [r'|\|'],
|
||||
"s": ["5","$"],
|
||||
"q": ["O."],
|
||||
"z": ["zZz", "7_"],
|
||||
"u": ["(_)"],
|
||||
"p": ["|°", "|*"],
|
||||
"d": ["|)", "I>", "ol"],
|
||||
"f": ["i="],
|
||||
"g": ["@"],
|
||||
"h": ["|-|"],
|
||||
"j": ["_I"],
|
||||
"y": ["`/"],
|
||||
"x": ["><"],
|
||||
"c": ["[", "(", "{"],
|
||||
"m": ["|v|", "nn"],
|
||||
"o": ["0", "()"],
|
||||
}
|
||||
|
||||
def leet(server, args):
|
||||
casechange = True
|
||||
strange = True
|
||||
stay = False
|
||||
|
||||
r = ""
|
||||
luflag = 0
|
||||
for x in list(args):
|
||||
if stay:
|
||||
alt = [x]
|
||||
else:
|
||||
alt = []
|
||||
if casechange:
|
||||
alt.append(luflag and x.lower() or x.upper())
|
||||
luflag = not luflag
|
||||
if strange:
|
||||
alt += leet_dict.get(x.lower(), [])
|
||||
r += random.choice(alt)
|
||||
wc.command(r)
|
||||
return 0
|
||||
|
||||
def flip(server, args):
|
||||
l = list(args)
|
||||
l.reverse()
|
||||
wc.command("".join(l))
|
||||
return 0
|
||||
|
||||
|
||||
|
||||
@@ -0,0 +1,101 @@
|
||||
"""
|
||||
:Author: Henning Hasemann <hhasemann [at] web [dot] de>
|
||||
|
||||
:What it does:
|
||||
This plugin lets you inform all users in the current
|
||||
channel about the song which music-player-daemon (MPD)
|
||||
is currently playing.
|
||||
|
||||
:Usage:
|
||||
/mpdnp - Display file mpd is playing to current channel.
|
||||
|
||||
:Configuration Variables:
|
||||
============= ==========================================
|
||||
Variable name Meaning
|
||||
============= ==========================================
|
||||
host The host where your mpd runs
|
||||
port The port to connect to mpd (usually 6600)
|
||||
format How this script should display
|
||||
whats going on.
|
||||
You may use the following variables here:
|
||||
$artist, $title_or_file,
|
||||
$length_min, $length_sec, $pct,
|
||||
$pos_min, $pos_sec
|
||||
|
||||
Released under GPL licence.
|
||||
"""
|
||||
|
||||
todo = """
|
||||
- maybe support sending commands to mpd.
|
||||
- maybe make condional display
|
||||
(displaying some characters only
|
||||
if preceding or trailing variables are set)
|
||||
"""
|
||||
|
||||
import weechat as wc
|
||||
import mpdclient as mpd
|
||||
import re
|
||||
from os.path import basename, splitext
|
||||
|
||||
default_fmt = "/me 's MPD plays: $artist - $title_or_file ($length_min:$length_sec)"
|
||||
|
||||
wc.register("mpdnp", "0.3", "", "np for mpd")
|
||||
|
||||
def subst(text, values):
|
||||
out = ""
|
||||
n = 0
|
||||
for match in re.finditer(findvar, text):
|
||||
if match is None: continue
|
||||
else:
|
||||
l, r = match.span()
|
||||
nam = match.group(1)
|
||||
out += text[n:l+1] + values.get(nam, "") #"$" + nam)
|
||||
n = r
|
||||
return out + text[n:]
|
||||
|
||||
def np(server, args):
|
||||
"""
|
||||
Send information about the currently
|
||||
played song to the channel.
|
||||
"""
|
||||
host = wc.get_plugin_config("host")
|
||||
port = int(wc.get_plugin_config("port"))
|
||||
cont = mpd.MpdController(host=host, port=port)
|
||||
song = cont.getCurrentSong()
|
||||
pos, length, pct = cont.getSongPosition()
|
||||
|
||||
# insert artist, title, album, track, path
|
||||
d = song.__dict__
|
||||
d.update({
|
||||
"title_or_file": song.title or splitext(basename(song.path))[0],
|
||||
"pos_sec": "%02d" % (pos / 60),
|
||||
"pos_min": str(pos / 60),
|
||||
"length_sec": "%02d" % (length % 60),
|
||||
"length_min": str(length / 60),
|
||||
"pct": "%2.0f" % pct,
|
||||
})
|
||||
|
||||
wc.command(subst(wc.get_plugin_config("format"), d))
|
||||
return 0
|
||||
|
||||
def dbgnp(server, args):
|
||||
try:
|
||||
return np(server, args)
|
||||
except Exception, e:
|
||||
print e
|
||||
|
||||
wc.add_command_handler("mpdnp", "np", "", "", np.__doc__)
|
||||
|
||||
findvar = re.compile(r'[^\\]\$([a-z_]+)(\b|[^a-z_])')
|
||||
|
||||
default = {
|
||||
"host": "localhost",
|
||||
"port": "6600",
|
||||
"format": default_fmt,
|
||||
}
|
||||
|
||||
for k, v in default.items():
|
||||
if not wc.get_plugin_config(k):
|
||||
wc.set_plugin_config(k, v)
|
||||
|
||||
|
||||
@@ -0,0 +1,445 @@
|
||||
# -*- encoding: iso-8859-1 -*-
|
||||
#
|
||||
# Copyright (c) 2006 by EgS <i@egs.name>
|
||||
#
|
||||
# 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 St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
#
|
||||
|
||||
|
||||
#######################################################################
|
||||
# #
|
||||
# This script enables the execution of events triggered commands #
|
||||
# where the events are attach or detach of the screen weechat #
|
||||
# is running in. #
|
||||
# #
|
||||
# Name: OnAttach #
|
||||
# Licence: GPL v2 #
|
||||
# Author: Marcus Eggenberger <i@egs.name> #
|
||||
# #
|
||||
# Usage: #
|
||||
# /onattach or /ondetach to add new events #
|
||||
# /screenevents to manage events #
|
||||
# #
|
||||
# use /help command for detailed information #
|
||||
# #
|
||||
# Changelog: #
|
||||
# 0.5: added screen guessing to backup screen-detection #
|
||||
# 0.4: fixed TypeError in weechat 0.1.9 #
|
||||
# 0.3: now checking on startup if weechat runs in a screen #
|
||||
# 0.2: added usage of get/set_plugin_config to store eventlist #
|
||||
# 0.1: first version released #
|
||||
# #
|
||||
#######################################################################
|
||||
|
||||
|
||||
|
||||
# ====================
|
||||
# Imports
|
||||
# ====================
|
||||
import os
|
||||
import sys
|
||||
|
||||
# ====================
|
||||
# Constants
|
||||
# ====================
|
||||
NAME = 'OnAttach'
|
||||
VERSION = '0.5'
|
||||
DESCRIPTION = "Executing commands on screen Attach/Detach"
|
||||
|
||||
OFF = False
|
||||
ON = True
|
||||
|
||||
# ====================
|
||||
# Exceptions
|
||||
# ====================
|
||||
class OnAttachError(Exception):
|
||||
pass
|
||||
|
||||
# ====================
|
||||
# Helpers
|
||||
# ====================
|
||||
class WeePrint(object):
|
||||
def write(self, text):
|
||||
text = text.rstrip(' \0\n') # strip the null byte appended by pythons print
|
||||
if text:
|
||||
weechat.prnt(text,'')
|
||||
|
||||
def getScreenByPpid():
|
||||
# the screen we are in should be our parents parent
|
||||
# aka something like:
|
||||
# SCREEN
|
||||
# \_ -/bin/bash
|
||||
# \_ weechat-curses
|
||||
ppid = os.getppid()
|
||||
|
||||
# get SCREEN pid
|
||||
pipe = os.popen("ps o ppid= -p %d" % ppid)
|
||||
screenpid = pipe.read().strip()
|
||||
pipe.close()
|
||||
|
||||
# check if screen pid really belongs to a screen
|
||||
pipe = os.popen("ps o cmd= -p %s" % screenpid)
|
||||
cmd = pipe.read().strip()
|
||||
pipe.close()
|
||||
|
||||
if 'screen' not in cmd.lower():
|
||||
raise OnAttachError
|
||||
else:
|
||||
return screenpid
|
||||
|
||||
def getScreenByList():
|
||||
# checks if there is only one attached screen
|
||||
# if so use: it! ;)
|
||||
pipe = os.popen("screen -list | grep -i attached")
|
||||
screens = pipe.read().strip()
|
||||
pipe.close()
|
||||
screens = screens.splitlines()
|
||||
|
||||
if len(screens) > 1:
|
||||
print "There are more then one screen currently attached."
|
||||
print "Detach all other running screens and reload OnAttach"
|
||||
print "to ensure correct screen detection."
|
||||
raise OnAttachError
|
||||
|
||||
try:
|
||||
socket, status = screens[0].split()
|
||||
except:
|
||||
# thats no common screen list...
|
||||
print "failed!"
|
||||
raise OnAttachError
|
||||
else:
|
||||
print "Using screen %s" % socket
|
||||
return socket
|
||||
|
||||
def getScreenPid():
|
||||
try:
|
||||
return getScreenByPpid()
|
||||
except OnAttachError:
|
||||
print "!!! Unable to determine screen by parentid!"
|
||||
print "Trying to guess screen..."
|
||||
return getScreenByList()
|
||||
|
||||
def registerFunction(function):
|
||||
# Register a python function as a commandhandler
|
||||
# Function needs to be named like weeFunction and
|
||||
# is bound to /function
|
||||
# docstring is used for weechat help
|
||||
functionname = function.__name__ # guess what :)
|
||||
weecommand = functionname[3:].lower() # strip the wee
|
||||
|
||||
doc = function.__doc__.splitlines()
|
||||
arguments = doc[0] # First docstring line is the arguments string
|
||||
description = doc[1][4:]
|
||||
args_description = '\n'.join([line[4:] for line in doc[2:-1]]) # join rest and strip indentation
|
||||
|
||||
if not function.func_defaults: # use args default value as template
|
||||
template = ''
|
||||
elif len(function.func_defaults) == 1:
|
||||
template = function.func_defaults[0]
|
||||
elif len(function.func_defaults) == 2:
|
||||
template = func.func_defaults[1]
|
||||
|
||||
weechat.add_command_handler(weecommand, functionname, description, arguments, args_description, template)
|
||||
|
||||
def registerFunctions():
|
||||
functions = [function for name, function in globals().iteritems() if name.startswith('wee') and callable(function)]
|
||||
for func in functions:
|
||||
registerFunction(func)
|
||||
|
||||
# ====================
|
||||
# Classes
|
||||
# ====================
|
||||
class Event(object):
|
||||
ESCAPECHAR = '\\'
|
||||
SEPARATOR = ';'
|
||||
|
||||
def __init__(self, delay, step, channel, server, command, activehigh=True):
|
||||
self.delay = int(delay)
|
||||
self.step = step
|
||||
self.channel = channel
|
||||
self.server = server
|
||||
self.command = command
|
||||
self.activestate = activehigh
|
||||
self.reset()
|
||||
|
||||
#@classmethod
|
||||
def unserialize(cls, step, serial):
|
||||
try:
|
||||
# let's try the easy way :)
|
||||
delay, channel, server, command, activestate = serial.split()
|
||||
except ValueError:
|
||||
# ok we got an escaped separator... :/
|
||||
data = serial.split(cls.SEPARATOR)
|
||||
for i in range(len(data)):
|
||||
if data[i].endswith(cls.ESCAPECHAR):
|
||||
data[i+1] = data[i] + cls.SEPARATOR + data[i+1]
|
||||
data = [item.replace(cls.ESCAPECHAR + cls.SEPARATOR, cls.SEPARATOR) for item in data if not item.endswith(cls.ESCAPECHAR)]
|
||||
delay, channel, server, command, activestate = data
|
||||
|
||||
|
||||
delay = int(delay)
|
||||
activestate = activestate == 'True'
|
||||
|
||||
return cls(delay, step, channel, server, command, activestate)
|
||||
# lets go for 2.3 compatiblity
|
||||
unserialize = classmethod(unserialize)
|
||||
|
||||
#@property
|
||||
def serialized(self):
|
||||
data = [self.delay, self.channel, self.server, self.command, self.activestate]
|
||||
data = [str(item).replace(self.SEPARATOR, self.ESCAPECHAR + self.SEPARATOR) for item in data]
|
||||
return self.SEPARATOR.join(data)
|
||||
# lets go for 2.3 compatiblity
|
||||
serialized = property(serialized)
|
||||
|
||||
def reset(self):
|
||||
self.currentdelay = self.delay
|
||||
self.fired = False
|
||||
|
||||
def fire(self):
|
||||
weechat.command(self.command, self.channel, self.server)
|
||||
self.fired = True
|
||||
|
||||
def stimulus(self, state):
|
||||
if state != self.activestate:
|
||||
self.reset()
|
||||
else:
|
||||
self.currentdelay -= self.step
|
||||
if self.currentdelay <= 0 and not self.fired:
|
||||
self.fire()
|
||||
|
||||
class CheckStatus(object):
|
||||
ESCAPECHAR = '\\'
|
||||
SEPARATOR = '|'
|
||||
|
||||
eventlist = []
|
||||
step = 5
|
||||
def __init__(self):
|
||||
try:
|
||||
self.screenpid = getScreenPid()
|
||||
except OnAttachError:
|
||||
raise
|
||||
|
||||
# try to read config data
|
||||
serializedEvents = weechat.get_plugin_config("events")
|
||||
if not serializedEvents:
|
||||
return
|
||||
|
||||
events = serializedEvents.split(self.SEPARATOR)
|
||||
for i in range(len(events)):
|
||||
if events[i].endswith(self.ESCAPECHAR):
|
||||
events[i+1] = events[i] + self.SEPARATOR + ss[i+1]
|
||||
events = [event.replace(self.ESCAPECHAR + self.SEPARATOR, self.SEPARATOR) for event in events if not event.endswith(self.ESCAPECHAR)]
|
||||
for event in events:
|
||||
try:
|
||||
self.eventlist.append(Event.unserialize(self.step, event))
|
||||
except:
|
||||
print "Unable to unserialize event!"
|
||||
print "Try to add the event manualy and save config again."
|
||||
|
||||
def __call__(self, server="", args=""):
|
||||
# check if the screen is attached or detatched
|
||||
pipe = os.popen("screen -list | grep %s" % self.screenpid)
|
||||
screenlist = pipe.read().strip()
|
||||
pipe.close()
|
||||
|
||||
if 'attached' in screenlist.lower():
|
||||
state = ON
|
||||
elif 'detached' in screenlist.lower():
|
||||
state = OFF
|
||||
else:
|
||||
print "Unable to determine screen status"
|
||||
return weechat.PLUGIN_RC_KO
|
||||
|
||||
for event in self.eventlist:
|
||||
event.stimulus(state)
|
||||
|
||||
return weechat.PLUGIN_RC_OK
|
||||
|
||||
def addEvent(self, delay, channel, server, command, activehigh=True):
|
||||
event = Event(delay, self.step, channel, server, command, activehigh)
|
||||
self.eventlist.append(event)
|
||||
|
||||
def showEvents(self):
|
||||
format = "%2s | %-10s | %-10s | %-15s | %-7s | %-2s %s"
|
||||
separator = "---+------------+------------+-----------------+---------+----"
|
||||
print separator
|
||||
print format % ("ID", "Server", "Channel", "Command", "Delay", "on", "")
|
||||
print separator
|
||||
for i in range(len(self.eventlist)):
|
||||
event = self.eventlist[i]
|
||||
if event.activestate:
|
||||
atde = 'AT'
|
||||
else:
|
||||
atde = 'DE'
|
||||
|
||||
if event.fired:
|
||||
fired = '*'
|
||||
else:
|
||||
fired = ''
|
||||
print format % (i, event.server[:10], event.channel[:10], event.command[:15], "%3d sec" % event.delay, atde, fired)
|
||||
print separator
|
||||
|
||||
def save(self):
|
||||
weechat.set_plugin_config("events",self.serialized)
|
||||
|
||||
#@property
|
||||
def serialized(self):
|
||||
events = [str(event.serialized).replace(self.SEPARATOR, self.ESCAPECHAR + self.SEPARATOR) for event in self.eventlist]
|
||||
return self.SEPARATOR.join(events)
|
||||
# lets go for 2.3 compatiblity
|
||||
serialized = property(serialized)
|
||||
|
||||
def dropEvent(self, eventid):
|
||||
del self.eventlist[eventid]
|
||||
|
||||
# ====================
|
||||
# Functions
|
||||
# ====================
|
||||
def addEvent(server, args, activehigh=True):
|
||||
delay, channel, command = args.split(' ', 2)
|
||||
delay = int(delay)
|
||||
|
||||
channel = channel.strip("'\"")
|
||||
checkStatus.addEvent(delay, channel, server, command, activehigh)
|
||||
if activehigh:
|
||||
atde = "at"
|
||||
else:
|
||||
atde = "de"
|
||||
|
||||
print "Added %stach event '%s' for channel %s on network %s with %d seconds delay" % (atde, command, channel, server, delay)
|
||||
|
||||
def weeOnAttach(server, args):
|
||||
"""delay channel command
|
||||
Adds a command which is executed after attaching the screen
|
||||
The command is executed <delay> seconds after the attach.
|
||||
Use "" or '' as channel if the command should be executed in
|
||||
the server buffer.
|
||||
|
||||
Example:
|
||||
/onattach 180 &bitlbee account on 0
|
||||
"""
|
||||
try:
|
||||
addEvent(server, args)
|
||||
except:
|
||||
weechat.command("/help onattach", "", server)
|
||||
return 0
|
||||
else:
|
||||
return 1
|
||||
|
||||
def weeOnDetach(server, args):
|
||||
"""delay channel command
|
||||
Adds a command which is executed after detaching the screen
|
||||
The command is executed <delay> seconds after the detach.
|
||||
Use "" or '' as channel if the command should be executed in
|
||||
the server buffer.
|
||||
|
||||
Example:
|
||||
/ondetach 180 &bitlbee account on 0
|
||||
"""
|
||||
try:
|
||||
addEvent(server, args, activehigh=False)
|
||||
except:
|
||||
weechat.command("/help onattach", "", server)
|
||||
return 0
|
||||
else:
|
||||
return 1
|
||||
|
||||
def weeScreenevents(server, args="show|save|drop"):
|
||||
"""show | save | drop eventid [eventid [...]]
|
||||
shows, saves or drops events
|
||||
show:
|
||||
Shows all current active events
|
||||
|
||||
save:
|
||||
Saves current events permanently
|
||||
|
||||
drop:
|
||||
Delete event from onAttach/onDetach list.
|
||||
Use /showevents to get eventid
|
||||
"""
|
||||
try:
|
||||
action, args = args.split(' ',1)
|
||||
except ValueError:
|
||||
action = args.strip()
|
||||
args = ''
|
||||
|
||||
actions = {'show':showEvents,
|
||||
'drop':dropEvent,
|
||||
'save':saveEvents}
|
||||
try:
|
||||
action = actions[action]
|
||||
except KeyError:
|
||||
weechat.command("/help screenevents", "", server)
|
||||
return 0
|
||||
else:
|
||||
return action(server, args)
|
||||
|
||||
|
||||
|
||||
def showEvents(server, args):
|
||||
checkStatus.showEvents()
|
||||
return 1
|
||||
|
||||
def dropEvent(server, args):
|
||||
try:
|
||||
eventids = [int(id) for id in args.split()]
|
||||
except:
|
||||
print "eventid musst be a number!"
|
||||
return 0
|
||||
|
||||
eventids.sort()
|
||||
eventids.reverse()
|
||||
for eventid in eventids:
|
||||
try:
|
||||
checkStatus.dropEvent(eventid)
|
||||
except:
|
||||
print "Unable to drop Event %d" % eventid
|
||||
return 0
|
||||
print "dropped %d events!" % len(eventids)
|
||||
return 1
|
||||
|
||||
def saveEvents(server, args):
|
||||
checkStatus.save()
|
||||
return 1
|
||||
|
||||
# ====================
|
||||
# Let's Register!
|
||||
# ====================
|
||||
if __name__ == '__main__':
|
||||
try:
|
||||
import weechat
|
||||
except ImportError:
|
||||
print "This script is to be loaded as PythonScript in WeeChat"
|
||||
print "Get WeeChat now at: http://weechat.flashtux.org/"
|
||||
import sys
|
||||
sys.exit(10)
|
||||
|
||||
# kick pythons print to weechat.prnt(msg, '')
|
||||
sys.stdout = WeePrint()
|
||||
weechat.register(NAME, VERSION, "", DESCRIPTION)
|
||||
try:
|
||||
checkStatus = CheckStatus()
|
||||
except OnAttachError:
|
||||
print "!!! Requirements for %s not met:" % NAME
|
||||
print "!!! - WeeChat is not running in a screen or not able to get screen PID"
|
||||
print "!!! --> Run WeeChat in a screen to fix the problem!"
|
||||
else:
|
||||
|
||||
weechat.add_timer_handler(checkStatus.step, "checkStatus")
|
||||
|
||||
registerFunctions()
|
||||
|
||||
|
||||
@@ -0,0 +1,136 @@
|
||||
|
||||
# =============================================================================
|
||||
# shell.py (c) March 2006 by Kolter <kolter+dev@openics.org>
|
||||
#
|
||||
# Licence : GPL v2
|
||||
# Description : running shell commands in WeeChat
|
||||
# Syntax : try /help shell to get some help on this script
|
||||
# Precond : needs weechat > 0.1.7 to run else it will crash WeeChat ;-)
|
||||
#
|
||||
#
|
||||
# ### changelog ###
|
||||
#
|
||||
# * version 0.1 :
|
||||
# - first release
|
||||
#
|
||||
# =============================================================================
|
||||
|
||||
import weechat, os, popen2
|
||||
|
||||
SHELL_CMD="shell"
|
||||
SHELL_PREFIX="[shell] "
|
||||
|
||||
weechat.register ("Shell", "0.1", "", "Running shell commands in WeeChat")
|
||||
weechat.add_command_handler(
|
||||
SHELL_CMD,
|
||||
"shell",
|
||||
"Running shell commands in WeeChat",
|
||||
"[-o] <command line>",
|
||||
" -o : print output on current server/channel\n"
|
||||
"<command line> : shell command or builtin like cd, getenv, setenv, unsetenv",
|
||||
"-o|cd|getenv|setenv|unsetenv cd|getenv|setenv|unsetenv"
|
||||
)
|
||||
|
||||
def shell_exec(command):
|
||||
proc = popen2.Popen3(command, True)
|
||||
status = proc.wait()
|
||||
results = []
|
||||
if status == 0:
|
||||
results = proc.fromchild.readlines()
|
||||
else:
|
||||
results = proc.childerr.readlines()
|
||||
return status, results
|
||||
|
||||
def shell_output(command, inchan):
|
||||
status, results = shell_exec(command)
|
||||
if status == 0:
|
||||
for line in results:
|
||||
if inchan:
|
||||
weechat.command(line.rstrip('\n'))
|
||||
else:
|
||||
weechat.prnt(line.rstrip('\n'))
|
||||
else:
|
||||
weechat.prnt("%san error occured while running command `%s'" % (SHELL_PREFIX, command))
|
||||
for line in results:
|
||||
weechat.prnt(line.rstrip('\n'))
|
||||
|
||||
|
||||
def shell_chdir(directory):
|
||||
if directory == "":
|
||||
if os.environ.has_key('HOME'):
|
||||
directory = os.environ['HOME']
|
||||
try:
|
||||
os.chdir(directory)
|
||||
except:
|
||||
weechat.prnt("%san error occured while running command `cd %s'" % (SHELL_PREFIX, directory))
|
||||
else:
|
||||
pass
|
||||
|
||||
def shell_getenv(var, inchan):
|
||||
var = var.strip()
|
||||
if var == "":
|
||||
weechat.prnt("%swrong syntax, try 'getenv VAR'" % (SHELL_PREFIX))
|
||||
return
|
||||
|
||||
value = os.getenv(var)
|
||||
if value == None:
|
||||
weechat.prnt("%s$%s is not set" % (SHELL_PREFIX, var))
|
||||
else:
|
||||
if inchan:
|
||||
weechat.command("$%s=%s" % (var, os.getenv(var)))
|
||||
else:
|
||||
weechat.prnt("%s$%s=%s" % (SHELL_PREFIX, var, os.getenv(var)))
|
||||
|
||||
def shell_setenv(expr, inchan):
|
||||
expr = expr.strip()
|
||||
lexpr = expr.split('=')
|
||||
|
||||
if (len(lexpr) < 2):
|
||||
weechat.prnt("%swrong syntax, try 'setenv VAR=VALUE'" % (SHELL_PREFIX))
|
||||
return
|
||||
|
||||
os.environ[lexpr[0].strip()] = "=".join(lexpr[1:])
|
||||
if not inchan:
|
||||
weechat.prnt("%s$%s is now set to '%s'" % (SHELL_PREFIX, lexpr[0], "=".join(lexpr[1:])))
|
||||
|
||||
def shell_unsetenv(var, inchan):
|
||||
var = var.strip()
|
||||
if var == "":
|
||||
weechat.prnt("%swrong syntax, try 'unsetenv VAR'" % (SHELL_PREFIX))
|
||||
return
|
||||
|
||||
if os.environ.has_key(var):
|
||||
del os.environ[var]
|
||||
weechat.prnt("%s$%s is now unset" % (SHELL_PREFIX, var))
|
||||
else:
|
||||
weechat.prnt("%s$%s is not set" % (SHELL_PREFIX, var))
|
||||
|
||||
def shell(server, args):
|
||||
largs = args.split(" ")
|
||||
|
||||
#strip spaces
|
||||
while '' in largs:
|
||||
largs.remove('')
|
||||
while ' ' in largs:
|
||||
largs.remove(' ')
|
||||
|
||||
if len(largs) == 0:
|
||||
weechat.command("/help %s" % SHELL_CMD)
|
||||
else:
|
||||
inchan = False
|
||||
if largs[0] == '-o':
|
||||
inchan = True
|
||||
largs = largs[1:]
|
||||
|
||||
if largs[0] == 'cd':
|
||||
shell_chdir(" ".join(largs[1:]), inchan)
|
||||
elif largs[0] == 'getenv':
|
||||
shell_getenv (" ".join(largs[1:]), inchan)
|
||||
elif largs[0] == 'setenv':
|
||||
shell_setenv (" ".join(largs[1:]), inchan)
|
||||
elif largs[0] == 'unsetenv':
|
||||
shell_unsetenv (" ".join(largs[1:]), inchan)
|
||||
else:
|
||||
shell_output(" ".join(largs), inchan)
|
||||
|
||||
return weechat.PLUGIN_RC_OK
|
||||
@@ -0,0 +1,197 @@
|
||||
#!/usr/bin/env python
|
||||
"""
|
||||
Theme manager for WeeChat.
|
||||
It loads configuration parameters from file
|
||||
and allows to create new theme out of current configuration.
|
||||
|
||||
by Stalwart <stlwrt@gmail.com>
|
||||
|
||||
Licensed under GNU GPL v2
|
||||
|
||||
"""
|
||||
|
||||
## ---------- Code starts here ----------
|
||||
import weechat
|
||||
import os
|
||||
|
||||
VERSION = "0.2.3"
|
||||
|
||||
weechat.register("theme", VERSION, "", "Theme manager for WeeChat")
|
||||
|
||||
THEMEDIR = weechat.get_info("weechat_dir") + '/themes'
|
||||
|
||||
weechat.add_command_handler("theme", "parameter_parser", "Apply and create themes", "[load <name> | save <name>]", "", "load|save")
|
||||
|
||||
settings = [
|
||||
'look_startup_logo',
|
||||
'look_startup_version',
|
||||
'look_weechat_slogan',
|
||||
'look_buffer_timestamp',
|
||||
'look_color_nicks_number',
|
||||
'look_color_actions',
|
||||
'look_nicklist',
|
||||
'look_nicklist_position',
|
||||
'look_nicklist_min_size',
|
||||
'look_nicklist_max_size',
|
||||
'look_no_nickname',
|
||||
'look_nickmode',
|
||||
'look_nickmode_empty',
|
||||
'look_nick_prefix',
|
||||
'look_nick_suffix',
|
||||
'look_align_nick',
|
||||
'look_align_other',
|
||||
'look_align_size',
|
||||
'look_align_size_max',
|
||||
'look_infobar',
|
||||
'look_infobar_timestamp',
|
||||
'look_infobar_seconds',
|
||||
'look_infobar_delay_highlight',
|
||||
'look_hotlist_names_count',
|
||||
'look_hotlist_names_level',
|
||||
'look_hotlist_names_length',
|
||||
'look_read_marker',
|
||||
'look_input_format',
|
||||
'col_separator',
|
||||
'col_title',
|
||||
'col_title_bg',
|
||||
'col_chat',
|
||||
'col_chat_time',
|
||||
'col_chat_time_sep',
|
||||
'col_chat_prefix1',
|
||||
'col_chat_prefix2',
|
||||
'col_chat_server',
|
||||
'col_chat_join',
|
||||
'col_chat_part',
|
||||
'col_chat_nick',
|
||||
'col_chat_host',
|
||||
'col_chat_channel',
|
||||
'col_chat_dark',
|
||||
'col_chat_highlight',
|
||||
'col_chat_bg',
|
||||
'col_chat_read_marker',
|
||||
'col_chat_read_marker_bg',
|
||||
'col_status',
|
||||
'col_status_delimiters',
|
||||
'col_status_channel',
|
||||
'col_status_data_msg',
|
||||
'col_status_private',
|
||||
'col_status_highlight',
|
||||
'col_status_data_other',
|
||||
'col_status_more',
|
||||
'col_status_bg',
|
||||
'col_infobar',
|
||||
'col_infobar_delimiters',
|
||||
'col_infobar_highlight',
|
||||
'col_infobar_bg',
|
||||
'col_input',
|
||||
'col_input_server',
|
||||
'col_input_channel',
|
||||
'col_input_nick',
|
||||
'col_input_delimiters',
|
||||
'col_input_bg',
|
||||
'col_nick',
|
||||
'col_nick_away',
|
||||
'col_nick_chanowner',
|
||||
'col_nick_chanadmin',
|
||||
'col_nick_op',
|
||||
'col_nick_halfop',
|
||||
'col_nick_voice',
|
||||
'col_nick_more',
|
||||
'col_nick_sep',
|
||||
'col_nick_self',
|
||||
'col_nick_color1',
|
||||
'col_nick_color2',
|
||||
'col_nick_color3',
|
||||
'col_nick_color4',
|
||||
'col_nick_color5',
|
||||
'col_nick_color6',
|
||||
'col_nick_color7',
|
||||
'col_nick_color8',
|
||||
'col_nick_color9',
|
||||
'col_nick_color10',
|
||||
'col_nick_private',
|
||||
'col_nick_bg',
|
||||
'col_chat_dcc_selected',
|
||||
'col_dcc_waiting',
|
||||
'col_dcc_connecting',
|
||||
'col_dcc_active',
|
||||
'col_dcc_done',
|
||||
'col_dcc_failed',
|
||||
'col_dcc_aborted'
|
||||
]
|
||||
|
||||
def themes_dir_available(writeable):
|
||||
if not os.access(THEMEDIR, os.F_OK):
|
||||
os.mkdir(THEMEDIR, 0700)
|
||||
if writeable:
|
||||
if os.access(THEMEDIR, os.W_OK):
|
||||
return 1
|
||||
else:
|
||||
return 0
|
||||
else:
|
||||
if os.access(THEMEDIR, os.R_OK):
|
||||
return 1
|
||||
else:
|
||||
return 0
|
||||
|
||||
def save_theme(theme_filename):
|
||||
if themes_dir_available(1):
|
||||
try:
|
||||
themefile = open("%s/%s" % (THEMEDIR, theme_filename), 'wU')
|
||||
except:
|
||||
weechat.print_infobar(3, "Bad theme name, try another")
|
||||
else:
|
||||
themefile.write("# This WeeChat theme has been generated by Themes v.%s\n" % VERSION)
|
||||
for variable in settings:
|
||||
try:
|
||||
value = weechat.get_config(variable)
|
||||
except:
|
||||
weechat.prnt("Unable to get the value of %s" % variable)
|
||||
else:
|
||||
themefile.write("%s=%s\n" % (variable, value))
|
||||
themefile.flush()
|
||||
themefile.close()
|
||||
weechat.print_infobar(3, "Theme %s saved" % theme_filename)
|
||||
|
||||
def load_theme(theme_filename):
|
||||
if themes_dir_available(0):
|
||||
if os.access("%s/%s" % (THEMEDIR, theme_filename), os.F_OK):
|
||||
themefile = open("%s/%s" % (THEMEDIR, theme_filename), 'rU')
|
||||
lines = themefile.readlines()
|
||||
for line in lines:
|
||||
if ((len(line) > 3) and (line[0] != '#') and (line.find("="))):
|
||||
try:
|
||||
weechat.set_config(line[:line.find("=")], line[line.find("=")+1:].replace("\n", ""))
|
||||
except:
|
||||
weechat.prnt("Unable to set the value of %s" % variable)
|
||||
weechat.print_infobar(3, "Theme %s applied" % theme_filename)
|
||||
else:
|
||||
weechat.print_infobar(3, "Theme %s doesn't exist" % theme_filename)
|
||||
themefile.close()
|
||||
|
||||
def list_themes():
|
||||
if themes_dir_available(0):
|
||||
files = os.listdir(THEMEDIR)
|
||||
if len(files):
|
||||
weechat.prnt('Available themes:')
|
||||
for filename in files:
|
||||
if filename[-9:] == '.weetheme':
|
||||
weechat.prnt(" %s" % filename[:-9])
|
||||
else:
|
||||
weechat.prnt('Theme directory is empty, you can create new theme out of your current configuration by executing "/theme save <name>". Additional themes available on http://weechat.flashtux.org')
|
||||
else:
|
||||
weechat.prnt('Theme directory is not available. Please, check access rights')
|
||||
|
||||
def parameter_parser(server, args):
|
||||
if ((args != '') & (len(args.split()) == 2)):
|
||||
if args.split()[0] == 'save':
|
||||
save_theme(args.split()[1] + '.weetheme')
|
||||
elif args.split()[0] == 'load':
|
||||
load_theme(args.split()[1] + '.weetheme')
|
||||
else:
|
||||
weechat.prnt('Invalid parameter, must be "load" or "save"')
|
||||
else:
|
||||
list_themes()
|
||||
return weechat.PLUGIN_RC_OK
|
||||
|
||||
|
||||
@@ -0,0 +1,334 @@
|
||||
#!/bin/env python
|
||||
#
|
||||
# TinyUrl, version 3.3, for weechat version 0.1.9
|
||||
#
|
||||
# Listens to all channels for long URLs, and submits them to tinyurl.com
|
||||
# for easier links.
|
||||
#
|
||||
# Usage:
|
||||
#
|
||||
# By default, any URL longer than 30 characters in length is grabbed,
|
||||
# submitted to 'tinyurl', and printed in the channel for your eyes only.
|
||||
# For example, you may see something like this:
|
||||
#
|
||||
# [11:21] <@lack> http://www.cbc.ca/story/canada/national/2005/11/12/mcdona
|
||||
# lds-051112.html?ref=rss
|
||||
# [11:21] -P- [AKA] http://tinyurl.com/9dthl
|
||||
#
|
||||
# Now you can just cut&paste the easier, shorter URL into your favourite
|
||||
# browser.
|
||||
#
|
||||
# If you want to be extra-helpful (or annoying) to certain channels you
|
||||
# are in, you can actually have the script say the tinyurl.com equivalent
|
||||
# of all long URLs, by adding the channel to the 'activechans' list. In
|
||||
# that case, everyone in the channel would see the following:
|
||||
#
|
||||
# [11:25] <testuser> http://www.cbc.ca/story/canada/national/2005/11/12/mcdona
|
||||
# lds-051112.html?ref=rss
|
||||
# [11:25] <@lack> [AKA] http://tinyurl.com/9dthl
|
||||
#
|
||||
# Configuration:
|
||||
#
|
||||
# Run '/help tinyurl' for the actual usage for setting these options:
|
||||
#
|
||||
# activechans
|
||||
# A comma-delimited list of channels you will actually "say" the
|
||||
# tinyurl in. By default the list is empty. Be warned, some channels
|
||||
# won't appreciate extra help (or 'noise' as they like to call it), and
|
||||
# some channels already have bots that do this. Please only enable
|
||||
# this in channels where the ops have given you permission.
|
||||
#
|
||||
# urllength
|
||||
# An integer, default value 30. Any URL this long or longer will
|
||||
# trigger a tinyurl event.
|
||||
#
|
||||
# printall
|
||||
# Either "on" or "off", default "on". When ON, you will see the
|
||||
# tinyurl printed in your window for any channels not in your
|
||||
# activechans list. When OFF, you will not see any tinyurls except in
|
||||
# your activechans list.
|
||||
#
|
||||
# Requirements:
|
||||
#
|
||||
# - Designed to run with weechat version 0.1.9 or better.
|
||||
# http://weechat.flashtux.org/
|
||||
#
|
||||
# - Requires that 'curl' is in the path (tested with curl 7.15.0).
|
||||
# http://curl.haxx.se/
|
||||
#
|
||||
# Copyright (C) 2005 Jim Ramsay <i.am@jimramsay.com>
|
||||
#
|
||||
# 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 02110-1301,
|
||||
# USA.
|
||||
#
|
||||
# Changelog:
|
||||
#
|
||||
# Version 3.3, July 4, 2006
|
||||
# Catches possible error in os.waitpid
|
||||
# Properly prints tinyurls in query windows
|
||||
#
|
||||
# Version 3.2, June 15, 2006
|
||||
# Multiple configuration bugfixes, pointed out by Stalwart on #weechat.
|
||||
#
|
||||
# Version 3.1, June 15, 2006
|
||||
# Now kills any leftover curl processes when the script is unloaded.
|
||||
# Thanks again to kolter for the great idea!
|
||||
# Also cleaned up /tinyurl command, added comletion_template, updated
|
||||
# help text, improved option parsing logic, etc.
|
||||
#
|
||||
# Version 3.0, June 15, 2006
|
||||
# Fixes "tinyurl script sometimes makes weechat freeze" issue by using
|
||||
# the new timer handlers available in Weechat 0.1.9
|
||||
# Also includes URL detection fix from Raimund Specht
|
||||
# <raimund@spemaus.de>.
|
||||
#
|
||||
# Version 2.0, Dec 13, 2005
|
||||
# Also catches https, ftp, and ftps URLs, thanks to kolter for the
|
||||
# suggestion!
|
||||
#
|
||||
# Version 1.1, Dec 2, 2005
|
||||
# Fixed undefined 'urlend' thanks to kolter@irc.freenode.org#weechat
|
||||
#
|
||||
# TODO:
|
||||
#
|
||||
# - Handle outgoing messages and replace long urls with the tinyurl
|
||||
# equivalent automatically.
|
||||
# - On load, check that 'curl' is installed, and fail if not.
|
||||
#
|
||||
|
||||
import os, tempfile, re
|
||||
try:
|
||||
import urllib
|
||||
except:
|
||||
raise ImportError("You need to reload the python plugin to reload urllib")
|
||||
import weechat
|
||||
|
||||
# Register with weechat
|
||||
weechat.register( "TinyUrl", "3.3", "tinyurlShutdown", "Waits for URLs and sends them to 'tinyurl' for you" )
|
||||
|
||||
# Global variables
|
||||
tinyurlParams = ("urllength","activechans","printall")
|
||||
tinyurlProcessList = {}
|
||||
|
||||
# Set default settings values:
|
||||
if weechat.get_plugin_config('urllength') == "":
|
||||
weechat.set_plugin_config('urllength', "30")
|
||||
if weechat.get_plugin_config('printall') != "on" and \
|
||||
weechat.get_plugin_config('printall') != "off":
|
||||
weechat.set_plugin_config('printall', "on")
|
||||
|
||||
# Start the timer thread and register handlers
|
||||
weechat.add_timer_handler( 1, "tinyurlCheckComplete" )
|
||||
weechat.add_message_handler("privmsg", "tinyurlHandleMessage")
|
||||
weechat.add_command_handler("tinyurl", "tinyurlMain", \
|
||||
"Sets/Gets 'tinyurl' settings.",
|
||||
"[<variable> [[=] <value>]]",
|
||||
"""When run without arguments, displays all tinyurl settings
|
||||
|
||||
<variable> : Sets or displays a single tinyurl setting. One of:
|
||||
activechans [[=] #chan1[,#chan2...]]
|
||||
List of channels where others will see your tinyurls.
|
||||
Default: None
|
||||
urllength [[=] length]
|
||||
Will not create tinyurls for any URLs shorter than this.
|
||||
Default: 30
|
||||
printall [[=] on|off]
|
||||
When off, will not display private tinyurls, just those
|
||||
displayed publicly in your "active channels"
|
||||
Default: on""",
|
||||
"urllength|activechans|printall"
|
||||
)
|
||||
|
||||
def tinyurlShutdown():
|
||||
"""Cleanup - Kills any leftover child processes"""
|
||||
if len(tinyurlProcessList.keys()) > 0:
|
||||
weechat.prnt( "-TinyUrl- Cleaning up unfinished processes:" )
|
||||
for pid in tinyurlProcessList.keys():
|
||||
weechat.prnt( " Process %d" % pid )
|
||||
try:
|
||||
os.kill(pid, 9)
|
||||
os.waitpid( pid, 0 )
|
||||
except:
|
||||
weechat.prnt( " Cleanup failed, skipping" )
|
||||
return weechat.PLUGIN_RC_OK
|
||||
|
||||
def tinyurlGet( name = "" ):
|
||||
"""Gets a variable value"""
|
||||
if name == "":
|
||||
weechat.prnt( "-TinyUrl- Get all:" )
|
||||
for name in tinyurlParams:
|
||||
weechat.prnt( " %s = %s" % (name, weechat.get_plugin_config(name)) )
|
||||
else:
|
||||
weechat.prnt( "-TinyUrl- Get:" )
|
||||
if name in tinyurlParams:
|
||||
weechat.prnt( " %s = %s" % (name, weechat.get_plugin_config(name)) )
|
||||
else:
|
||||
weechat.prnt( " Unknown parameter \"%s\", try '/help tinyurl'" % name )
|
||||
return
|
||||
|
||||
def tinyurlSet( name, value ):
|
||||
"""Sets a variable value"""
|
||||
if value == "":
|
||||
tinyurlGet( name )
|
||||
else:
|
||||
weechat.prnt( "-TinyUrl- Set:" )
|
||||
if name in tinyurlParams:
|
||||
if name == "printall":
|
||||
if value == "0" or value.lower() == "no" or value.lower() == "off":
|
||||
weechat.set_plugin_config(name, "off")
|
||||
elif value == "1" or value.lower() == "yes" or value.lower() == "on":
|
||||
weechat.set_plugin_config(name, "on")
|
||||
else:
|
||||
weechat.prnt( " printall must be one of 'on' or 'off'" )
|
||||
weechat.prnt( " value = '%s'" % value )
|
||||
return
|
||||
else:
|
||||
if name == "activechans":
|
||||
vs = re.split(", |,| ", value)
|
||||
values = []
|
||||
for v in vs:
|
||||
if v.startswith("#"):
|
||||
values.append(v)
|
||||
value = ",".join(values)
|
||||
weechat.set_plugin_config(name, value)
|
||||
weechat.prnt( " %s = %s" % (name, weechat.get_plugin_config(name)) )
|
||||
else:
|
||||
weechat.prnt( " Unknown parameter \'%s\'" % name )
|
||||
return
|
||||
|
||||
def tinyurlMain( server, args ):
|
||||
"""Main handler for the /tinyurl command"""
|
||||
args = args.split( " " )
|
||||
while '' in args:
|
||||
args.remove('')
|
||||
while ' ' in args:
|
||||
args.remove(' ')
|
||||
if len(args) == 0:
|
||||
tinyurlGet()
|
||||
else:
|
||||
name = args[0]
|
||||
value = ""
|
||||
if len(args) > 1:
|
||||
if args[1] == "=":
|
||||
value = " ".join(args[2:])
|
||||
else:
|
||||
value = " ".join(args[1:])
|
||||
tinyurlSet( args[0], value )
|
||||
else:
|
||||
tinyurlGet( name )
|
||||
return weechat.PLUGIN_RC_OK
|
||||
|
||||
def tinyurlGetUrl( url, channel, server ):
|
||||
"""Starts a background process which will query 'tinyurl.com' and put the
|
||||
result in a file that the timer function 'tinyurlCheck' will find and
|
||||
parse."""
|
||||
global tinyurlProcessList
|
||||
handle, filename = tempfile.mkstemp( prefix="weechat-tinyurl.py-" )
|
||||
os.close(handle)
|
||||
cmd = ("curl -d url=%s http://tinyurl.com/create.php --stderr /dev/null -o %s" % \
|
||||
(urllib.quote(url), filename)).split()
|
||||
try:
|
||||
pid = os.spawnvp( os.P_NOWAIT, cmd[0], cmd )
|
||||
tinyurlProcessList[pid] = (filename, channel, server)
|
||||
except Exception, e:
|
||||
weechat.prnt( "-TinyUrl- Error: Could not spawn curl: %s" % e )
|
||||
|
||||
def tinyurlParsefile( filename ):
|
||||
"""Parses the given HTML file and pulls out the tinyurl."""
|
||||
turl = None
|
||||
try:
|
||||
html = open(filename, "r")
|
||||
for line in html:
|
||||
if( line.startswith("<input type=hidden name=tinyurl value=\"") ):
|
||||
turlend = line[39:].find("\"")
|
||||
if turlend > -1:
|
||||
turl = line[39:][:turlend]
|
||||
break
|
||||
html.close()
|
||||
except Exception, e:
|
||||
weechat.prnt( "-TinyUrl- Error: Could not open result file %s: %s" % (filename, e) )
|
||||
return turl
|
||||
|
||||
def tinyurlPrint( url, channel, server ):
|
||||
"""Prints the new tinyurl either to just you, or to the whole channel"""
|
||||
activeChans = weechat.get_plugin_config('activechans').split(',')
|
||||
if channel in activeChans:
|
||||
weechat.command( "/msg %s [AKA] %s" % ( channel, url) )
|
||||
else:
|
||||
weechat.prnt( "[AKA] %s" % (url), channel, server )
|
||||
|
||||
def tinyurlFindUrlstart( msg, start = 0 ):
|
||||
"""Finds the beginnings of URLs"""
|
||||
index = -1
|
||||
if start < 0 or start >= len(msg):
|
||||
return index
|
||||
for prefix in ( "http://", "https://", "ftp://", "ftps://" ):
|
||||
index = msg.find( prefix, start )
|
||||
if index > -1:
|
||||
break
|
||||
return index
|
||||
|
||||
def tinyurlFindUrlend( msg, urlstart ):
|
||||
"""Finds the ends of URLs (Strips following punctuation)"""
|
||||
m = msg[urlstart:]
|
||||
index = m.find( " " )
|
||||
if index == -1:
|
||||
index = len(m)
|
||||
while msg[index-1] in ( "?", ".", "!" ):
|
||||
index -= 1
|
||||
return index + urlstart
|
||||
|
||||
def tinyurlCheckComplete():
|
||||
"""The periodic poll of all waiting processes"""
|
||||
global tinyurlProcessList
|
||||
for pid in tinyurlProcessList.keys():
|
||||
(filename, channel, server) = tinyurlProcessList[pid]
|
||||
try:
|
||||
(p, er) = os.waitpid( pid, os.WNOHANG )
|
||||
if p != 0:
|
||||
if er == 0:
|
||||
tinyurl = tinyurlParsefile(filename)
|
||||
if tinyurl is not None:
|
||||
tinyurlPrint( tinyurl, channel, server )
|
||||
else:
|
||||
weechat.prnt( "-TinyUrl- Error: 'curl' did not run properly" )
|
||||
os.unlink(filename)
|
||||
del tinyurlProcessList[pid]
|
||||
except OSError, e:
|
||||
weechat.prnt( "-TinyUrl- Error: 'curl' process not found: %s", e )
|
||||
os.unlink(filename)
|
||||
del tinyurlProcessList[pid]
|
||||
return weechat.PLUGIN_RC_OK
|
||||
|
||||
def tinyurlHandleMessage( server, args ):
|
||||
"""Handles IRC PRIVMSG and checks for URLs"""
|
||||
maxlen = int(weechat.get_plugin_config( "urllength" ))
|
||||
activeChans = weechat.get_plugin_config('activechans').split(',')
|
||||
onlyActiveChans = weechat.get_plugin_config('printall') == "off"
|
||||
(source, type, channel, msg) = args.split(" ", 3)
|
||||
if onlyActiveChans and channel not in activeChans:
|
||||
return weechat.PLUGIN_RC_OK
|
||||
if not channel.startswith("#"):
|
||||
channel = source.split("!", 2)[0][1:]
|
||||
urlstart = tinyurlFindUrlstart( msg )
|
||||
while urlstart > -1 and urlstart is not None:
|
||||
urlend = tinyurlFindUrlend( msg, urlstart )
|
||||
url = msg[urlstart:urlend]
|
||||
if len(url) >= maxlen:
|
||||
tinyurlGetUrl(url, channel, server)
|
||||
# Check for more URLs
|
||||
urlstart = tinyurlFindUrlstart( msg, urlend+1 )
|
||||
return weechat.PLUGIN_RC_OK
|
||||
|
||||
@@ -0,0 +1,69 @@
|
||||
"""
|
||||
:Author: Henning Hasemann <hhasemann [at] web [dot] de>
|
||||
|
||||
:What it does:
|
||||
This script listens for messages beginning
|
||||
with a special token and appends these messages
|
||||
to a file.
|
||||
This way people can post you short assignments which
|
||||
you cant forget and dont have to look up in your look.
|
||||
(try appending "cat /path/to/mytodofile" at your .bashrc)
|
||||
|
||||
:Usage:
|
||||
- Load this file
|
||||
- Make sure to set suitable configuration values.
|
||||
token: The piece of text that signals a TODO
|
||||
file: The file where the TODOs should be appended
|
||||
allowed_sources: A space-seperated list of nicknames
|
||||
which are allowed to send TODOs to you.
|
||||
- Whenever any allowed person sends a message beginning
|
||||
with your desired token, the rest of that message is
|
||||
append to the desired TODO-file.
|
||||
|
||||
Released under GPL licence.
|
||||
"""
|
||||
__version__ = "0.1"
|
||||
|
||||
import weechat as wc
|
||||
|
||||
wc.register("todo", __version__, "", "automatic TODO")
|
||||
wc.add_message_handler("privmsg", "on_msg")
|
||||
|
||||
default = {
|
||||
"token": "##todo ",
|
||||
"file": "/home/USER/todo",
|
||||
"allowed_sources": "",
|
||||
}
|
||||
|
||||
for k, v in default.items():
|
||||
if not wc.get_plugin_config(k):
|
||||
wc.set_plugin_config(k, v)
|
||||
|
||||
def source_allowed(src):
|
||||
return src in wc.get_plugin_config("allowed_sources").split()
|
||||
|
||||
def on_msg(server, args):
|
||||
# args looks like:
|
||||
# :foo!foo@host PRIVMSG #channel :Hello, how are you?
|
||||
|
||||
token = wc.get_plugin_config("token")
|
||||
filename = wc.get_plugin_config("file")
|
||||
|
||||
try:
|
||||
nothing, info, message = args.split(":", 2)
|
||||
hostmask, privmsg, channel = info.split(None, 2)
|
||||
source = hostmask.split("!")[0]
|
||||
except ValueError:
|
||||
# Parsing didnt work,
|
||||
# this happens mostly when strange messages
|
||||
# arrive that dont have the format described above
|
||||
return 0
|
||||
|
||||
if source_allowed(source) and message.lower().startswith(token):
|
||||
wc.print_infobar(5, "NEW TASK: " + str(message[7:]))
|
||||
f = open(filename, "a")
|
||||
f.write("%s (%s)\n" % (message[7:], source))
|
||||
f.close()
|
||||
|
||||
return 0
|
||||
|
||||
@@ -0,0 +1,131 @@
|
||||
# -*- encoding: iso-8859-1 -*-
|
||||
#
|
||||
# Copyright (c) 2006 by EgS <i@egs.name>
|
||||
#
|
||||
# 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 St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
#
|
||||
|
||||
|
||||
#######################################################################
|
||||
# #
|
||||
# This script adds a simple command to toggle weechat options #
|
||||
# #
|
||||
# Name: Toggle #
|
||||
# Licence: GPL v2 #
|
||||
# Author: Marcus Eggenberger <i@egs.name> #
|
||||
# #
|
||||
# Usage: #
|
||||
# /toggle look_nicklist #
|
||||
# #
|
||||
# use /help command for detailed information #
|
||||
# #
|
||||
# Changelog: #
|
||||
# 0.1: first version released #
|
||||
# #
|
||||
#######################################################################
|
||||
|
||||
|
||||
|
||||
# ====================
|
||||
# Imports
|
||||
# ====================
|
||||
import sys
|
||||
|
||||
# ====================
|
||||
# Constants
|
||||
# ====================
|
||||
NAME = 'Toggle'
|
||||
VERSION = '0.1'
|
||||
DESCRIPTION = "Simple tool to toggle ON/OFF settings"
|
||||
|
||||
VALUES = ['OFF','ON']
|
||||
|
||||
# ====================
|
||||
# Exceptions
|
||||
# ====================
|
||||
|
||||
# ====================
|
||||
# Helpers
|
||||
# ====================
|
||||
class WeePrint(object):
|
||||
def write(self, text):
|
||||
text = text.rstrip(' \0\n') # strip the null byte appended by pythons print
|
||||
if text:
|
||||
weechat.prnt(text,'')
|
||||
|
||||
def registerFunction(function):
|
||||
# Register a python function as a commandhandler
|
||||
# Function needs to be named like weeFunction and
|
||||
# is bound to /function
|
||||
# docstring is used for weechat help
|
||||
functionname = function.__name__ # guess what :)
|
||||
weecommand = functionname[3:].lower() # strip the wee
|
||||
|
||||
doc = function.__doc__.splitlines()
|
||||
arguments = doc[0] # First docstring line is the arguments string
|
||||
description = doc[1][4:]
|
||||
args_description = '\n'.join([line[4:] for line in doc[2:-1]]) # join rest and strip indentation
|
||||
|
||||
if not function.func_defaults: # use args default value as template
|
||||
template = ''
|
||||
elif len(function.func_defaults) == 1:
|
||||
template = function.func_defaults[0]
|
||||
elif len(function.func_defaults) == 2:
|
||||
template = func.func_defaults[1]
|
||||
|
||||
weechat.add_command_handler(weecommand, functionname, description, arguments, args_description, template)
|
||||
|
||||
def registerFunctions():
|
||||
functions = [function for name, function in globals().iteritems() if name.startswith('wee') and callable(function)]
|
||||
for func in functions:
|
||||
registerFunction(func)
|
||||
|
||||
# ====================
|
||||
# Functions
|
||||
# ====================
|
||||
def weeToggle(server, args="%o"):
|
||||
"""<setting>
|
||||
Toggles any setting from ON to OFF and vice versa.
|
||||
Example:
|
||||
/toggle look_nicklist
|
||||
"""
|
||||
option = args
|
||||
currentvalue = weechat.get_config(option).upper()
|
||||
if currentvalue not in VALUES:
|
||||
print "%s cannot be toggled!" % option
|
||||
else:
|
||||
newvalue = VALUES[VALUES.index(currentvalue) - 1]
|
||||
weechat.set_config(option, newvalue)
|
||||
print "%s = %s" % (option, newvalue)
|
||||
return weechat.PLUGIN_RC_OK
|
||||
|
||||
# ====================
|
||||
# Let's Register!
|
||||
# ====================
|
||||
if __name__ == '__main__':
|
||||
try:
|
||||
import weechat
|
||||
except ImportError:
|
||||
print "This script is to be loaded as PythonScript in WeeChat"
|
||||
print "Get WeeChat now at: http://weechat.flashtux.org/"
|
||||
import sys
|
||||
sys.exit(10)
|
||||
|
||||
# kick pythons print to weechat.prnt(msg, '')
|
||||
sys.stdout = WeePrint()
|
||||
weechat.register(NAME, VERSION, "", DESCRIPTION)
|
||||
registerFunctions()
|
||||
|
||||
|
||||
@@ -0,0 +1,18 @@
|
||||
# This script sends "uname -a" output to current channel.
|
||||
# Just type /uname while chatting on some channel ;)
|
||||
|
||||
# by Stalwart <stlwrt doggy gmail.com>
|
||||
#
|
||||
# Released under GPL licence.
|
||||
|
||||
import weechat
|
||||
from os import popen
|
||||
|
||||
def senduname(server, args):
|
||||
unameout = popen ('uname -a')
|
||||
uname = unameout.readline()
|
||||
weechat.command(uname[:-1])
|
||||
return 0
|
||||
|
||||
weechat.register ('uname', '1.0', '', """Sends "uname -a" output to current channel""")
|
||||
weechat.add_command_handler ('uname', 'senduname')
|
||||
@@ -0,0 +1,447 @@
|
||||
#
|
||||
# UrlGrab, version 1.0, for weechat version 0.1.6
|
||||
#
|
||||
# Listens to all channels for URLs, collects them in a list, and launches
|
||||
# them in your favourite web server on the local host or a remote server.
|
||||
#
|
||||
# Usage:
|
||||
#
|
||||
# The /url command provides access to all UrlGrab functions. Run
|
||||
# '/url help' for complete command usage.
|
||||
#
|
||||
# In general, use '/url list' to list the entire url list for the current
|
||||
# channel, and '/url <n>' to launch the nth url in the list. For
|
||||
# example, to launch the first (and most-recently added) url in the list,
|
||||
# you would run '/url 1'
|
||||
#
|
||||
# From the server window, you must specify a specific channel for the
|
||||
# list and launch commands, for example:
|
||||
# /url list #weechat
|
||||
# /url 3 #weechat
|
||||
#
|
||||
# Configuration:
|
||||
#
|
||||
# The '/url set' command lets you get and set the following options:
|
||||
#
|
||||
# historysize
|
||||
# The maximum number of URLs saved per channel. Default is 10
|
||||
#
|
||||
# method
|
||||
# Must be one of 'local' or 'remote' - Defines how URLs are launched by
|
||||
# the script. If 'local', the script will run 'localcmd' on the host.
|
||||
# If 'remote', the script will run 'remotessh remotehost remotecmd' on
|
||||
# the local host which should normally use ssh to connect to another
|
||||
# host and run the browser command there.
|
||||
#
|
||||
# localcmd
|
||||
# The command to run on the local host to launch URLs in 'local' mode.
|
||||
# The string '%s' will be replaced with the URL. The default is
|
||||
# 'firefox %s'.
|
||||
#
|
||||
# remotessh
|
||||
# The command (and arguments) used to connect to the remote host for
|
||||
# 'remote' mode. The default is 'ssh -x' which will connect as the
|
||||
# current username via ssh and disable X11 forwarding.
|
||||
#
|
||||
# remotehost
|
||||
# The remote host to which we will connect in 'remote' mode. For ssh,
|
||||
# this can just be a hostname or 'user@host' to specify a username
|
||||
# other than your current login name. The default is 'localhost'.
|
||||
#
|
||||
# remotecmd
|
||||
# The command to execute on the remote host for 'remote' mode. The
|
||||
# default is 'bash -c "DISPLAY=:0.0 firefox %s"' Which runs bash, sets
|
||||
# up the environment to display on the remote host's main X display,
|
||||
# and runs firefox. As with 'localcmd', the string '%s' will be
|
||||
# replaced with the URL.
|
||||
#
|
||||
# cmdoutput
|
||||
# The file where the command output (if any) is saved. Overwritten
|
||||
# each time you launch a new URL. Default is ~/.weechat/urllaunch.log
|
||||
#
|
||||
# Requirements:
|
||||
#
|
||||
# - Designed to run with weechat version 1.0.6 or better.
|
||||
# http://weechat.flashtux.org/
|
||||
#
|
||||
# Acknowlegements:
|
||||
#
|
||||
# - Based on an earlier version called 'urlcollector.py' by 'kolter' of
|
||||
# irc.freenode.net/#weechat Honestly, I just cleaned up the code a bit and
|
||||
# made the settings a little more useful (to me).
|
||||
#
|
||||
# Copyright (C) 2005 Jim Ramsay <i.am@jimramsay.com>
|
||||
#
|
||||
# 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 02110-1301,
|
||||
# USA.
|
||||
#
|
||||
|
||||
import os
|
||||
import weechat
|
||||
|
||||
UC_NAME="UrlGrab"
|
||||
UC_VERSION="1.0"
|
||||
|
||||
weechat.register (UC_NAME, UC_VERSION, "", "Url collector/launcher for weechat")
|
||||
weechat.add_message_handler("privmsg", "urlGrabCheck")
|
||||
weechat.add_command_handler("url", "urlGrabMain",
|
||||
"Controls UrlGrab -> '/url help' for usage")
|
||||
|
||||
def urlGrabPrint(message):
|
||||
weechat.prnt("-[%s]- %s" % ( UC_NAME, message ) )
|
||||
|
||||
class WeechatSetting:
|
||||
def __init__(self, name, default, description = "" ):
|
||||
self.name = name
|
||||
self.default = default
|
||||
self.description = description
|
||||
test = weechat.get_plugin_config( name )
|
||||
if test is None or test == "":
|
||||
weechat.set_plugin_config( name, default )
|
||||
|
||||
class UrlGrabSettings:
|
||||
def __init__(self):
|
||||
self.settings = {
|
||||
'historysize':WeechatSetting('historysize', '10',
|
||||
"Number of URLs to keep per channel" ),
|
||||
'method':WeechatSetting('method', 'local',
|
||||
"""Where to launch URLs
|
||||
If 'local', runs %localcmd%.
|
||||
If 'remote' runs the following command:
|
||||
`%remotessh% %remotehost% %remotecmd`"""),
|
||||
'localcmd':WeechatSetting('localcmd', 'firefox %s',
|
||||
"""Command to launch local URLs. '%s' becomes the URL.
|
||||
Default 'firefox %s'"""),
|
||||
'remotessh':WeechatSetting('remotessh', 'ssh -x',
|
||||
"""Command (and arguments) to connect to a remote machine.
|
||||
Default 'ssh -x'"""),
|
||||
'remotehost':WeechatSetting('remotehost', 'localhost',
|
||||
"""Hostname for remote launching
|
||||
Default 'localhost'"""),
|
||||
'remotecmd':WeechatSetting('remotecmd',
|
||||
'bash -c \"DISPLAY=:0.0 firefox %s\"',
|
||||
"""Command to launch remote URLs. '%s' becomes the URL.
|
||||
Default 'bash -c \"DISPLAY=:0.0 firefox %s\"'"""),
|
||||
'cmdlog':WeechatSetting('cmdlog',
|
||||
'~/.weechat/urllaunch.log',
|
||||
"""File where command output is saved. Overwritten each
|
||||
time an URL is launched
|
||||
Default '~/.weechat/urllaunch.log'""" )
|
||||
}
|
||||
|
||||
def has(self, name):
|
||||
return self.settings.has_key(name)
|
||||
|
||||
def names(self):
|
||||
return self.settings.keys()
|
||||
|
||||
def description(self, name):
|
||||
return self.settings[name].description
|
||||
|
||||
def set(self, name, value):
|
||||
# Force string values only
|
||||
if type(value) != type("a"):
|
||||
value = str(value)
|
||||
if name == "method":
|
||||
if value.lower() == "remote":
|
||||
weechat.set_plugin_config( 'method', "remote" )
|
||||
elif value.lower() == "local":
|
||||
weechat.set_plugin_config( 'method', "local" )
|
||||
else:
|
||||
raise ValueError( "\'%s\' is not \'local\' or \'remote\'" % value )
|
||||
elif name == "localcmd":
|
||||
if value.find( "%s" ) == -1:
|
||||
weechat.set_plugin_config( 'localcmd', value + " %s" )
|
||||
else:
|
||||
weechat.set_plugin_config( 'localcmd', value )
|
||||
elif name == "remotecmd":
|
||||
if value.find( "%s" ) == -1:
|
||||
weechat.set_plugin_config( 'remotecmd', value + " %s" )
|
||||
else:
|
||||
weechat.set_plugin_config( 'remotecmd', value )
|
||||
elif self.has(name):
|
||||
weechat.set_plugin_config( name, value )
|
||||
if name == "historysize":
|
||||
urlGrab.setHistorysize(int(value))
|
||||
else:
|
||||
raise KeyError( name )
|
||||
|
||||
def get(self, name):
|
||||
if self.has(name):
|
||||
return weechat.get_plugin_config(name)
|
||||
else:
|
||||
raise KeyError( name )
|
||||
|
||||
def prnt(self, name, verbose = True):
|
||||
weechat.prnt( " %s = %s" % (name.ljust(11), self.get(name)) )
|
||||
if verbose:
|
||||
weechat.prnt( " -> %s" % (self.settings[name].description) )
|
||||
|
||||
def prntall(self):
|
||||
for key in self.names():
|
||||
self.prnt(key, verbose = False)
|
||||
|
||||
def createCmdList(self, url):
|
||||
if weechat.get_plugin_config( 'method' ) == 'remote':
|
||||
tmplist = weechat.get_plugin_config( 'remotessh' ).split(" ")
|
||||
tmplist.append(weechat.get_plugin_config( 'remotehost' ))
|
||||
tmplist.append(weechat.get_plugin_config( 'remotecmd' ) % (url))
|
||||
else:
|
||||
tmplist = (weechat.get_plugin_config( 'localcmd' ) % (url) ).split(" ")
|
||||
return tmplist
|
||||
|
||||
class UrlGrabber:
|
||||
def __init__(self, historysize):
|
||||
# init
|
||||
self.urls = {}
|
||||
self.historysize = 5
|
||||
# control
|
||||
self.setHistorysize(historysize)
|
||||
|
||||
def setHistorysize(self, count):
|
||||
if count > 1:
|
||||
self.historysize = count
|
||||
|
||||
def getHistorysize(self):
|
||||
return self.historysize
|
||||
|
||||
def addUrl(self, url, channel, server):
|
||||
# check for server
|
||||
if not self.urls.has_key(server):
|
||||
self.urls[server] = {}
|
||||
# check for chan
|
||||
if not self.urls[server].has_key(channel):
|
||||
self.urls[server][channel] = []
|
||||
# add url
|
||||
if url in self.urls[server][channel]:
|
||||
self.urls[server][channel].remove(url)
|
||||
self.urls[server][channel].insert(0, url)
|
||||
# removing old urls
|
||||
while len(self.urls[server][channel]) > self.historysize:
|
||||
self.urls[server][channel].pop()
|
||||
|
||||
def hasIndex( self, index, channel, server ):
|
||||
return self.urls.has_key(server) and \
|
||||
self.urls[server].has_key(channel) and \
|
||||
len(self.url[server][channel]) >= index
|
||||
|
||||
def hasChannel( self, channel, server ):
|
||||
return self.urls.has_key(server) and \
|
||||
self.urls[server].has_key(channel)
|
||||
|
||||
def hasServer( self, server ):
|
||||
return self.urls.has_key(server)
|
||||
|
||||
def getUrl(self, index, channel, server):
|
||||
url = ""
|
||||
if self.urls.has_key(server):
|
||||
if self.urls[server].has_key(channel):
|
||||
if len(self.urls[server][channel]) >= index:
|
||||
url = self.urls[server][channel][index-1]
|
||||
return url
|
||||
|
||||
|
||||
def prnt(self, channel, server):
|
||||
found = True
|
||||
if self.urls.has_key(server):
|
||||
if self.urls[server].has_key(channel):
|
||||
urlGrabPrint(channel + "@" + server)
|
||||
if len(self.urls[server][channel]) > 0:
|
||||
i = 1
|
||||
for url in self.urls[server][channel]:
|
||||
weechat.prnt(" --> " + str(i) + " : " + url)
|
||||
i += 1
|
||||
else:
|
||||
found = False
|
||||
elif channel == "*":
|
||||
for channel in self.urls[server].keys():
|
||||
self.prnt(channel, server)
|
||||
else:
|
||||
found = False
|
||||
else:
|
||||
found = False
|
||||
|
||||
if not found:
|
||||
urlGrabPrint(channel + "@" + server + ": no entries")
|
||||
|
||||
def urlGrabParsemsg(command):
|
||||
infos = command.split(" ")
|
||||
chan = infos[2]
|
||||
message = " ".join(infos[3:])[1:]
|
||||
return (chan, message)
|
||||
|
||||
def urlGrabCheck(server, args):
|
||||
global urlGrab
|
||||
chan, message = urlGrabParsemsg(args)
|
||||
# Ignore output from 'tinyurl.py'
|
||||
if message.startswith( "[AKA] http://tinyurl.com" ):
|
||||
return weechat.PLUGIN_RC_OK
|
||||
# Check for URLs
|
||||
for word in message.split(" "):
|
||||
if word[0:7] == "http://" or \
|
||||
word[0:8] == "https://" or \
|
||||
word[0:6] == "ftp://":
|
||||
urlGrab.addUrl(word, chan, server)
|
||||
# check for any dead children and clean them up
|
||||
while True:
|
||||
try:
|
||||
mypid, status = os.waitpid(0, os.WNOHANG)
|
||||
except:
|
||||
break
|
||||
else:
|
||||
if mypid <= 0:
|
||||
break
|
||||
return weechat.PLUGIN_RC_OK
|
||||
|
||||
def urlGrabOpen(index, channel = None):
|
||||
global urlGrab, urlGrabSettings
|
||||
|
||||
server = weechat.get_info("server")
|
||||
if channel is None or channel == "":
|
||||
channel = weechat.get_info("channel")
|
||||
|
||||
if channel == "":
|
||||
urlGrabPrint( "No current channel, you must specify one" )
|
||||
elif not urlGrab.hasChannel( channel, server ):
|
||||
urlGrabPrint("No URL found - Invalid channel")
|
||||
else:
|
||||
if index <= 0:
|
||||
urlGrabPrint("No URL found - Invalid index")
|
||||
return
|
||||
url = urlGrab.getUrl(index, channel, server)
|
||||
if url == "":
|
||||
urlGrabPrint("No URL found - Invalid index")
|
||||
else:
|
||||
urlGrabPrint("loading %s %sly" % (url, urlGrabSettings.get("method")))
|
||||
logfile = os.path.expanduser( urlGrabSettings.get( 'cmdlog' ) )
|
||||
|
||||
argl = urlGrabSettings.createCmdList( url )
|
||||
dout = open(logfile, "w")
|
||||
dout.write( "UrlGrab: Running '%s'\n" % (" ".join(argl)) )
|
||||
dout.close()
|
||||
try:
|
||||
childpid = os.fork()
|
||||
except:
|
||||
urlGrabPrint("Fork failed!")
|
||||
if childpid == 0:
|
||||
# in the child- Detach from tty and Exec the command
|
||||
logfile = os.path.expanduser( urlGrabSettings.get( 'cmdlog' ) )
|
||||
din = open("/dev/null", "r")
|
||||
dout = open(logfile, "a")
|
||||
try:
|
||||
# Redirect IO for the child
|
||||
os.dup2(din.fileno(), 0)
|
||||
os.dup2(dout.fileno(), 1)
|
||||
os.dup2(dout.fileno(), 2)
|
||||
except:
|
||||
dout.write( "UrlGrab: IO Redirection failed\n" )
|
||||
dout.close()
|
||||
din.close()
|
||||
sys.exit(1)
|
||||
try:
|
||||
# Actually run the command
|
||||
os.execvp( argl[0], argl )
|
||||
except:
|
||||
dout.write( "UrlGrab: Exec failed" )
|
||||
dout.close()
|
||||
din.close()
|
||||
sys.exit(1)
|
||||
else:
|
||||
# In the parent - Don't wait now, wait later.
|
||||
return
|
||||
|
||||
def urlGrabList( args ):
|
||||
global urlGrab
|
||||
channel = ""
|
||||
if len(args) == 0:
|
||||
channel = weechat.get_info("channel")
|
||||
else:
|
||||
channel = args[0]
|
||||
|
||||
if channel == "" or channel == "all":
|
||||
channel = "*"
|
||||
urlGrab.prnt(channel, weechat.get_info("server"))
|
||||
|
||||
def urlGrabHelp():
|
||||
weechat.prnt("")
|
||||
urlGrabPrint("Help")
|
||||
weechat.prnt(" Usage : ")
|
||||
weechat.prnt(" /url help")
|
||||
weechat.prnt(" -> display this help")
|
||||
weechat.prnt(" /url list [channel]")
|
||||
weechat.prnt(" -> display list of recorded urls in the specified channel")
|
||||
weechat.prnt(" If no channel is given, lists the current channel")
|
||||
weechat.prnt(" /url set [name [[=] value]]")
|
||||
weechat.prnt(" -> set or get one of the parameters")
|
||||
weechat.prnt(" /url n [channel]")
|
||||
weechat.prnt(" -> launch the nth url in `/url list`")
|
||||
weechat.prnt(" or the nth url in the specified channel")
|
||||
weechat.prnt("")
|
||||
|
||||
def urlGrabMain(server, args):
|
||||
largs = args.split(" ")
|
||||
#strip spaces
|
||||
while '' in largs:
|
||||
largs.remove('')
|
||||
while ' ' in largs:
|
||||
largs.remove(' ')
|
||||
if len(largs) == 0:
|
||||
urlGrabHelp()
|
||||
else:
|
||||
if largs[0] == 'help':
|
||||
urlGrabHelp()
|
||||
elif largs[0] == 'list':
|
||||
urlGrabList( largs[1:] )
|
||||
elif largs[0] == 'set':
|
||||
try:
|
||||
if (len(largs) == 1):
|
||||
urlGrabPrint( "Available settings:" )
|
||||
urlGrabSettings.prntall()
|
||||
elif (len(largs) == 2):
|
||||
name = largs[1]
|
||||
urlGrabPrint( "Get %s" % name )
|
||||
urlGrabSettings.prnt( name )
|
||||
elif (len(largs) > 2):
|
||||
name = largs[1]
|
||||
value = None
|
||||
if( largs[2] != "="):
|
||||
value = " ".join(largs[2:])
|
||||
elif( largs > 3 and largs[2] == "=" ):
|
||||
value = " ".join(largs[3:])
|
||||
urlGrabPrint( "set %s = \'%s\'" % (name, value) )
|
||||
if value is not None:
|
||||
try:
|
||||
urlGrabSettings.set( name, value )
|
||||
urlGrabSettings.prnt( name, verbose=False )
|
||||
except ValueError, msg:
|
||||
weechat.prnt( " Failed: %s" % msg )
|
||||
else:
|
||||
weechat.prnt( " Failed: No value given" )
|
||||
except KeyError:
|
||||
weechat.prnt( " Failed: Unrecognized parameter '%s'" % name )
|
||||
else:
|
||||
try:
|
||||
no = int(largs[0])
|
||||
if len(largs) > 1:
|
||||
urlGrabOpen(no, largs[1])
|
||||
else:
|
||||
urlGrabOpen(no)
|
||||
except ValueError:
|
||||
urlGrabPrint( "Unknown command '%s'. Try '/url help' for usage" % largs[0])
|
||||
return weechat.PLUGIN_RC_OK
|
||||
|
||||
# Initialize global variables
|
||||
urlGrabSettings = UrlGrabSettings()
|
||||
urlGrab = UrlGrabber( urlGrabSettings.get('historysize') )
|
||||
Reference in New Issue
Block a user