Compare commits
74 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 312d0783cf | |||
| 8564297e2a | |||
| c015835d3a | |||
| 1d14abd875 | |||
| 74bed4bc02 | |||
| 8f229f41e1 | |||
| b4d6decc06 | |||
| 04f87b7587 | |||
| b7dd384048 | |||
| e101afab38 | |||
| 37e9165548 | |||
| 25bb7a978d | |||
| 7d531a9bbf | |||
| 1c009f394a | |||
| 649ea0baf7 | |||
| de942e40ac | |||
| 5d3c2bea95 | |||
| 620418fa3b | |||
| 28e4bc1399 | |||
| a0becea2fc | |||
| 6a72c7382b | |||
| 86d7b7aed5 | |||
| 07201b7bdc | |||
| 2ae916fc1a | |||
| 2ba8908024 | |||
| 4a287a724e | |||
| 87e1236b30 | |||
| 0044672b85 | |||
| e921a619b0 | |||
| 25282cfe23 | |||
| 8187bedcb6 | |||
| 79140c3abc | |||
| 4d11be0b85 | |||
| b746c014aa | |||
| f69edd6606 | |||
| 385de6f4fe | |||
| 0fdffa0e50 | |||
| 36c59ff375 | |||
| 71f3532e04 | |||
| d135728424 | |||
| 2185af0b7d | |||
| f22764ec56 | |||
| 02c7c6dcd6 | |||
| 364eb009ca | |||
| d4cbc576e2 | |||
| 9bb9c9868c | |||
| cd8e3d6d41 | |||
| fa965a85e4 | |||
| 59a4c356dd | |||
| c912726f49 | |||
| fbfe0ba18a | |||
| 5ee210a5b7 | |||
| 5d55d7f6de | |||
| b952fc1f6d | |||
| 89065e4d34 | |||
| bc4b8ee19f | |||
| 281ef2e93e | |||
| 9b22d72fd1 | |||
| f11635ed7f | |||
| a1e47ca4c9 | |||
| 6c7a2ce3c8 | |||
| 153d8c55d9 | |||
| d14bc2df53 | |||
| d8299a1231 | |||
| 465c2e4082 | |||
| 2a97c01215 | |||
| 152ba0847d | |||
| fe88e30bf5 | |||
| a8a852d4b3 | |||
| e41f503202 | |||
| 762aaffecf | |||
| 99ac971b66 | |||
| e75e840346 | |||
| 3d59a94554 |
@@ -1,3 +1,5 @@
|
||||
sudo: required
|
||||
dist: trusty
|
||||
language: c
|
||||
notifications:
|
||||
irc:
|
||||
@@ -25,15 +27,18 @@ compiler:
|
||||
before_install:
|
||||
# We need this PPA for a recent version of libedit
|
||||
- sudo add-apt-repository ppa:ondrej/php5-5.6 -y
|
||||
# We need this PPA for Lua 5.3
|
||||
- sudo add-apt-repository ppa:vbernat/haproxy-1.6 -y
|
||||
- sudo apt-get update -qq
|
||||
install:
|
||||
- sudo apt-get install -y help2man libedit-dev expect
|
||||
- sudo apt-get install -y libncursesw5-dev libreadline-dev libedit-dev
|
||||
liblua5.3-dev help2man expect
|
||||
before_script:
|
||||
- mkdir build
|
||||
- cd build
|
||||
script:
|
||||
- cmake .. -DCMAKE_INSTALL_PREFIX=/usr
|
||||
-DWANT_READLINE=$readline -DWANT_LIBEDIT=$libedit
|
||||
- make
|
||||
- make all test
|
||||
- cpack -G DEB
|
||||
- ../test
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
project (uirc3 C)
|
||||
cmake_minimum_required (VERSION 2.8.5)
|
||||
cmake_minimum_required (VERSION 2.8.11)
|
||||
|
||||
# Options
|
||||
option (WANT_READLINE "Use GNU Readline for the UI (better)" ON)
|
||||
@@ -14,7 +14,7 @@ endif ("${CMAKE_C_COMPILER_ID}" MATCHES "GNU" OR CMAKE_COMPILER_IS_GNUC)
|
||||
# Version
|
||||
set (project_VERSION_MAJOR "0")
|
||||
set (project_VERSION_MINOR "9")
|
||||
set (project_VERSION_PATCH "1")
|
||||
set (project_VERSION_PATCH "2")
|
||||
|
||||
set (project_VERSION "${project_VERSION_MAJOR}")
|
||||
set (project_VERSION "${project_VERSION}.${project_VERSION_MINOR}")
|
||||
@@ -38,6 +38,20 @@ list (APPEND project_libraries ${libssl_LIBRARIES})
|
||||
include_directories (${libssl_INCLUDE_DIRS})
|
||||
link_directories (${libssl_LIBRARY_DIRS})
|
||||
|
||||
# FIXME: other Lua versions may be acceptable, don't know yet
|
||||
pkg_search_module (lua lua53 lua5.3 lua-5.3 lua>=5.3)
|
||||
option (WITH_LUA "Enable experimental support for Lua plugins" ${lua_FOUND})
|
||||
|
||||
if (WITH_LUA)
|
||||
if (NOT lua_FOUND)
|
||||
message (FATAL_ERROR "Lua library not found")
|
||||
endif (NOT lua_FOUND)
|
||||
|
||||
list (APPEND project_libraries ${lua_LIBRARIES})
|
||||
include_directories (${lua_INCLUDE_DIRS})
|
||||
link_directories (${lua_LIBRARY_DIRS})
|
||||
endif (WITH_LUA)
|
||||
|
||||
# -lpthread is only there for debugging (gdb & errno)
|
||||
# -lrt is only for glibc < 2.17
|
||||
# -liconv may or may not be a part of libc
|
||||
@@ -75,16 +89,13 @@ elseif (WANT_LIBEDIT)
|
||||
endif ((WANT_READLINE AND WANT_LIBEDIT) OR (NOT WANT_READLINE AND NOT WANT_LIBEDIT))
|
||||
|
||||
# Generate a configuration file
|
||||
if (WANT_READLINE)
|
||||
set (HAVE_READLINE 1)
|
||||
endif (WANT_READLINE)
|
||||
|
||||
if (WANT_LIBEDIT)
|
||||
set (HAVE_EDITLINE 1)
|
||||
endif (WANT_LIBEDIT)
|
||||
set (HAVE_READLINE "${WANT_READLINE}")
|
||||
set (HAVE_EDITLINE "${WANT_LIBEDIT}")
|
||||
set (HAVE_LUA "${WITH_LUA}")
|
||||
|
||||
include (GNUInstallDirs)
|
||||
set (plugin_dir ${CMAKE_INSTALL_LIBDIR}/${PROJECT_NAME})
|
||||
# ZyklonB is currently an odd duck but degesch follows normal XDG rules
|
||||
set (zyklonb_plugin_dir ${CMAKE_INSTALL_LIBDIR}/zyklonb/plugins)
|
||||
configure_file (${PROJECT_SOURCE_DIR}/config.h.in ${PROJECT_BINARY_DIR}/config.h)
|
||||
include_directories (${PROJECT_SOURCE_DIR} ${PROJECT_BINARY_DIR})
|
||||
|
||||
@@ -111,13 +122,44 @@ target_link_libraries (degesch ${project_libraries})
|
||||
add_executable (kike kike.c kike-replies.c ${common_sources} ${common_headers})
|
||||
target_link_libraries (kike ${project_libraries})
|
||||
|
||||
# Tests
|
||||
function (make_tests_for target_name)
|
||||
get_target_property (sources ${target_name} SOURCES)
|
||||
get_target_property (libraries ${target_name} LINK_LIBRARIES)
|
||||
|
||||
set (test test-${target_name})
|
||||
add_executable (${test} ${sources})
|
||||
target_link_libraries (${test} ${libraries})
|
||||
add_test (NAME ${test} COMMAND ${test})
|
||||
set_target_properties (${test} PROPERTIES COMPILE_DEFINITIONS TESTING)
|
||||
endfunction (make_tests_for)
|
||||
|
||||
include (CTest)
|
||||
if (BUILD_TESTING)
|
||||
make_tests_for (degesch)
|
||||
endif (BUILD_TESTING)
|
||||
|
||||
# Various clang-based diagnostics, loads of fake positives and spam
|
||||
file (GLOB clang_tidy_sources *.c)
|
||||
set (clang_tidy_checks misc-* readability-*
|
||||
-readability-braces-around-statements
|
||||
-readability-named-parameter)
|
||||
string (REPLACE ";" "," clang_tidy_checks "${clang_tidy_checks}")
|
||||
|
||||
set (CMAKE_EXPORT_COMPILE_COMMANDS ON)
|
||||
add_custom_target (clang-tidy
|
||||
COMMAND clang-tidy -p ${PROJECT_BINARY_DIR} -checks=${clang_tidy_checks}
|
||||
${clang_tidy_sources} 1>&2
|
||||
USES_TERMINAL
|
||||
WORKING_DIRECTORY ${PROJECT_SOURCE_DIR})
|
||||
|
||||
# Installation
|
||||
install (TARGETS zyklonb degesch kike DESTINATION ${CMAKE_INSTALL_BINDIR})
|
||||
install (FILES LICENSE DESTINATION ${CMAKE_INSTALL_DOCDIR})
|
||||
|
||||
foreach (plugin coin eval script youtube ${plugins})
|
||||
install (FILES plugins/${plugin} DESTINATION ${plugin_dir})
|
||||
endforeach (plugin)
|
||||
install (DIRECTORY plugins/zyklonb/
|
||||
DESTINATION ${zyklonb_plugin_dir} USE_SOURCE_PERMISSIONS)
|
||||
install (DIRECTORY plugins/degesch/
|
||||
DESTINATION ${CMAKE_INSTALL_DATADIR}/degesch/plugins)
|
||||
|
||||
# Generate documentation from program help
|
||||
find_program (HELP2MAN_EXECUTABLE help2man)
|
||||
|
||||
28
NEWS
28
NEWS
@@ -1,3 +1,29 @@
|
||||
0.9.2 (2015-12-31)
|
||||
|
||||
* degesch: added rudimentary support for Lua scripting
|
||||
|
||||
* degesch: added detection of pasting, so that it doesn't trigger other
|
||||
keyboard shortcuts, such as for autocomplete
|
||||
|
||||
* degesch: added auto-away capability
|
||||
|
||||
* degesch: added an /oper command
|
||||
|
||||
* degesch: libedit backend works again
|
||||
|
||||
* degesch: added capability to edit the input line using VISUAL/EDITOR
|
||||
|
||||
* degesch: added Meta-Tab to switch to the last used buffer
|
||||
|
||||
* degesch: correctly respond to stopping and resuming (SIGTSTP)
|
||||
|
||||
* degesch: fixed decoding of text formatting
|
||||
|
||||
* degesch: unseen PMs now show up as highlights
|
||||
|
||||
* degesch: various bugfixes
|
||||
|
||||
|
||||
0.9.1 (2015-09-25)
|
||||
|
||||
* All "ssl" options have been renamed to "tls"
|
||||
@@ -20,7 +46,7 @@
|
||||
* degesch: joins, parts, nick changes and quits don't count as new buffer
|
||||
activity anymore
|
||||
|
||||
* degesch: add Meta-H to open the full log file
|
||||
* degesch: added Meta-H to open the full log file
|
||||
|
||||
* degesch: various bugfixes and little improvements
|
||||
|
||||
|
||||
@@ -1,43 +1,54 @@
|
||||
uirc3
|
||||
=====
|
||||
:compact-option:
|
||||
|
||||
The unethical IRC trinity. This project consists of an experimental IRC client,
|
||||
daemon, and bot. It's all you're ever going to need for chatting.
|
||||
daemon, and bot. It's all you're ever going to need for chatting, as long as
|
||||
you can make do with minimalist software.
|
||||
|
||||
All of them have these potentially interesting properties:
|
||||
|
||||
- full IPv6 support
|
||||
- TLS support, including client certificates
|
||||
- minimal dependencies
|
||||
- very compact and easy to hack on
|
||||
- compact and arguably easy to hack on
|
||||
- permissive license
|
||||
|
||||
degesch
|
||||
-------
|
||||
The IRC client. It is largely defined by being built on top of GNU Readline.
|
||||
Its interface should however feel familiar for weechat or irssi users.
|
||||
The IRC client. It is largely defined by being built on top of GNU Readline
|
||||
that has been hacked to death. Its interface should feel somewhat familiar for
|
||||
weechat or irssi users.
|
||||
|
||||
This is the youngest and largest application within the project. It has most of
|
||||
the stuff you'd expect of an IRC client, such as being able to set up multiple
|
||||
servers, powerful configuration system, integrated help, mIRC text formatting,
|
||||
CTCP queries, automatic splitting of overlong messages, autocomplete, logging
|
||||
to file, and command aliases.
|
||||
This is the largest application within the project. It has most of the stuff
|
||||
you'd expect of an IRC client, such as being able to set up multiple servers,
|
||||
a powerful configuration system, integrated help, text formatting, CTCP queries,
|
||||
automatic splitting of overlong messages, autocomplete, logging to file,
|
||||
auto-away, command aliases and rudimentary support for Lua scripting.
|
||||
|
||||
kike
|
||||
----
|
||||
The IRC daemon. It is designed to be used as a regular user application rather
|
||||
than a system-wide daemon. If all you want is a decent, minimal IRCd for
|
||||
a small network of respectful users (or bots), or testing, this one will do it.
|
||||
testing purposes or a small network of respectful users (or bots), this one will
|
||||
do it just fine.
|
||||
|
||||
Notable features:
|
||||
- TLS autodetection (why doesn't everyone have this?)
|
||||
- IRCop authentication through TLS client certificates
|
||||
- epoll/kqueue support; it should be able to handle quite a number of users
|
||||
|
||||
- TLS autodetection (why doesn't everyone have this?), using secure defaults
|
||||
- IRCop authentication via TLS client certificates
|
||||
- epoll/kqueue support; this means that it should be able to handle quite
|
||||
a number of concurrent user connections
|
||||
- partial IRCv3 support
|
||||
|
||||
Not supported:
|
||||
|
||||
- server linking (which also means no services); I consider existing protocols
|
||||
for this purpose ugly and tricky to implement correctly
|
||||
- online changes to configuration; the config system from degesch could be used
|
||||
- limits of almost any kind, just connections and mode +l
|
||||
for this purpose ugly and tricky to implement correctly; I've also found no
|
||||
use for this feature yet
|
||||
- online changes to configuration; the configuration system from degesch could
|
||||
be used to implement this feature if needed
|
||||
- limits of almost any kind, just connections and mode `+l`
|
||||
|
||||
ZyklonB
|
||||
-------
|
||||
@@ -45,64 +56,66 @@ The IRC bot. It builds upon the concept of my other VitaminA IRC bot. The main
|
||||
characteristic of these two bots is that they run plugins as coprocesses, which
|
||||
allows for enhanced reliability and programming language freedom.
|
||||
|
||||
While originally intended to be a simple C99 rewrite of the original bot, which
|
||||
was written in the GNU dialect of AWK, it fairly quickly became a playground
|
||||
where I added everything that seemed nice, and it eventually got me into writing
|
||||
the rest of this package.
|
||||
While originally intended to be a simple rewrite of the original AWK bot in C,
|
||||
it fairly quickly became a playground, and it eventually got me into writing
|
||||
the rest of the package.
|
||||
|
||||
Notable features:
|
||||
- resilient against crashes, server disconnects and timeouts
|
||||
- SOCKS support (even though socksify can add that easily to any program)
|
||||
It survives crashes, server disconnects and timeouts, and also has native SOCKS
|
||||
support (even though socksify can add that easily to any program).
|
||||
|
||||
Building
|
||||
--------
|
||||
Build dependencies: CMake, pkg-config, help2man, awk, sh, liberty (included)
|
||||
Build dependencies: CMake, pkg-config, help2man, awk, sh, liberty (included) +
|
||||
Runtime dependencies: openssl, curses (degesch),
|
||||
readline or libedit >= 2013-07-12 (degesch)
|
||||
readline >= 6.0 or libedit >= 2013-07-12 (degesch),
|
||||
lua >= 5.3 (degesch, optional)
|
||||
|
||||
$ git clone https://github.com/pjanouch/uirc3.git
|
||||
$ git submodule init
|
||||
$ git submodule update
|
||||
$ mkdir build
|
||||
$ cd build
|
||||
$ git clone --recursive https://github.com/pjanouch/uirc3.git
|
||||
$ mkdir uirc3/build
|
||||
$ cd uirc3/build
|
||||
$ cmake .. -DCMAKE_INSTALL_PREFIX=/usr -DCMAKE_BUILD_TYPE=Debug \
|
||||
-DWANT_READLINE=ON -DWANT_LIBEDIT=OFF
|
||||
-DWANT_READLINE=ON -DWANT_LIBEDIT=OFF -DWANT_LUA=ON
|
||||
$ make
|
||||
|
||||
To install the application, you can do either the usual:
|
||||
|
||||
# make install
|
||||
|
||||
Or you can try telling CMake to make a package for you. For Debian it is:
|
||||
|
||||
$ cpack -G DEB
|
||||
# dpkg -i uirc3-*.deb
|
||||
|
||||
Note that for versions of CMake before 2.8.9, you need to prefix cpack with
|
||||
`fakeroot' or file ownership will end up wrong.
|
||||
Note that for versions of CMake before 2.8.9, you need to prefix `cpack` with
|
||||
`fakeroot` or file ownership will end up wrong.
|
||||
|
||||
Running
|
||||
-------
|
||||
`degesch' has in-program configuration. Just run it and read the instructions.
|
||||
'degesch' has in-program configuration. Just run it and read the instructions.
|
||||
|
||||
For the rest you might want to generate a configuration file:
|
||||
|
||||
$ zyklonb --write-default-config
|
||||
$ kike --write-default-config
|
||||
|
||||
After making any necessary edits to the file (there are comments to aid you in
|
||||
doing that), simply run the appropriate program with no arguments:
|
||||
|
||||
$ zyklonb
|
||||
$ kike
|
||||
|
||||
`ZyklonB' stays running in the foreground, therefore I recommend launching it
|
||||
'ZyklonB' stays running in the foreground, therefore I recommend launching it
|
||||
inside a Screen or tmux session.
|
||||
|
||||
`kike', on the other hand, immediately forks into the background. Use the PID
|
||||
file or something like `killall' if you want to terminate it. You can run it
|
||||
as a `forking' type systemd user service.
|
||||
'kike', on the other hand, immediately forks into the background. Use the PID
|
||||
file or something like `killall` if you want to terminate it. You can run it
|
||||
as a `forking` type systemd user service.
|
||||
|
||||
Client Certificates
|
||||
-------------------
|
||||
`kike' uses SHA1 fingerprints of TLS client certificates to authenticate users.
|
||||
'kike' uses SHA1 fingerprints of TLS client certificates to authenticate users.
|
||||
To get the fingerprint from a certificate file in the required form, use:
|
||||
|
||||
$ openssl x509 -in public.pem -outform DER | sha1sum
|
||||
|
||||
Contributing and Support
|
||||
@@ -118,7 +131,7 @@ And no, I'm not going to change the names.
|
||||
|
||||
License
|
||||
-------
|
||||
`uirc3' is written by Přemysl Janouch <p.janouch@gmail.com>.
|
||||
'uirc3' is written by Přemysl Janouch <p.janouch@gmail.com>.
|
||||
|
||||
You may use the software under the terms of the ISC license, the text of which
|
||||
is included within the package, or, at your option, you may relicense the work
|
||||
@@ -2,9 +2,10 @@
|
||||
#define CONFIG_H
|
||||
|
||||
#define PROGRAM_VERSION "${project_VERSION}"
|
||||
#define PLUGIN_DIR "${CMAKE_INSTALL_PREFIX}/${plugin_dir}"
|
||||
#define ZYKLONB_PLUGIN_DIR "${CMAKE_INSTALL_PREFIX}/${zyklonb_plugin_dir}"
|
||||
|
||||
#cmakedefine HAVE_READLINE
|
||||
#cmakedefine HAVE_EDITLINE
|
||||
#cmakedefine HAVE_LUA
|
||||
|
||||
#endif // ! CONFIG_H
|
||||
|
||||
9
kike.c
9
kike.c
@@ -1784,7 +1784,7 @@ mode_processor_do_user (struct mode_processor *self, int mode)
|
||||
target, self->channel->name);
|
||||
else if (irc_modify_mode (&target_user->modes, mode, self->adding))
|
||||
{
|
||||
str_append_c (self->output, self->mode_char); \
|
||||
str_append_c (self->output, self->mode_char);
|
||||
str_vector_add (self->output_params, client->nickname);
|
||||
}
|
||||
}
|
||||
@@ -3421,6 +3421,13 @@ irc_try_fetch_client (struct server_context *ctx, int listen_fd)
|
||||
c->ping_timer.dispatcher = on_client_ping_timer;
|
||||
c->ping_timer.user_data = c;
|
||||
|
||||
// A little bit questionable once the traffic gets high enough (IMO),
|
||||
// but it reduces silly latencies that we don't need because we already
|
||||
// do buffer our output
|
||||
int yes = 1;
|
||||
soft_assert (setsockopt (fd, IPPROTO_TCP, TCP_NODELAY,
|
||||
&yes, sizeof yes) != -1);
|
||||
|
||||
set_blocking (fd, false);
|
||||
client_update_poller (c, NULL);
|
||||
client_set_kill_timer (c);
|
||||
|
||||
2
liberty
2
liberty
Submodule liberty updated: 649c351560...f6d74544f8
33
plugins/degesch/ping-timeout.lua
Normal file
33
plugins/degesch/ping-timeout.lua
Normal file
@@ -0,0 +1,33 @@
|
||||
--
|
||||
-- ping-timeout.lua: ping timeout readability enhancement plugin
|
||||
--
|
||||
-- Copyright (c) 2015, Přemysl Janouch <p.janouch@gmail.com>
|
||||
--
|
||||
-- Permission to use, copy, modify, and/or distribute this software for any
|
||||
-- purpose with or without fee is hereby granted, provided that the above
|
||||
-- copyright notice and this permission notice appear in all copies.
|
||||
--
|
||||
-- THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
||||
-- WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
||||
-- MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
|
||||
-- SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
||||
-- WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
|
||||
-- OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
|
||||
-- CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||
--
|
||||
|
||||
degesch.hook_irc (function (hook, server, line)
|
||||
local start, timeout =
|
||||
line:match ("^(:[^ ]* QUIT :Ping timeout:) (%d+) seconds$")
|
||||
if not start then
|
||||
return line
|
||||
end
|
||||
|
||||
local minutes = timeout // 60
|
||||
if minutes == 0 then
|
||||
return line
|
||||
end
|
||||
|
||||
local seconds = timeout % 60
|
||||
return ("%s %d minutes, %d seconds"):format (start, minutes, seconds)
|
||||
end)
|
||||
63
plugins/degesch/utm-filter.lua
Normal file
63
plugins/degesch/utm-filter.lua
Normal file
@@ -0,0 +1,63 @@
|
||||
--
|
||||
-- utm-filter.lua: filter out Google Analytics bullshit from URLs
|
||||
--
|
||||
-- Copyright (c) 2015, Přemysl Janouch <p.janouch@gmail.com>
|
||||
--
|
||||
-- Permission to use, copy, modify, and/or distribute this software for any
|
||||
-- purpose with or without fee is hereby granted, provided that the above
|
||||
-- copyright notice and this permission notice appear in all copies.
|
||||
--
|
||||
-- THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
||||
-- WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
||||
-- MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
|
||||
-- SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
||||
-- WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
|
||||
-- OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
|
||||
-- CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||
--
|
||||
|
||||
-- A list of useless URL parameters that don't affect page function
|
||||
local banned = {
|
||||
gclid = 1,
|
||||
|
||||
utm_source = 1,
|
||||
utm_medium = 1,
|
||||
utm_term = 1,
|
||||
utm_content = 1,
|
||||
utm_campaign = 1,
|
||||
}
|
||||
|
||||
-- Go through a parameter list and throw out any banned elements
|
||||
local do_args = function (args)
|
||||
local filtered = {}
|
||||
for part in args:gmatch ("[^&]+") do
|
||||
if not banned[part:match ("^[^=]*")] then
|
||||
table.insert (filtered, part)
|
||||
end
|
||||
end
|
||||
return table.concat (filtered, "&")
|
||||
end
|
||||
|
||||
-- Filter parameters in both the query and the fragment part of an URL
|
||||
local do_single_url = function (url)
|
||||
return url:gsub ('^([^?#]*)%?([^#]*)', function (start, query)
|
||||
local clean = do_args (query)
|
||||
return #clean > 0 and start .. "?" .. clean or start
|
||||
end, 1):gsub ('^([^#]*)#(.*)', function (start, fragment)
|
||||
local clean = do_args (fragment)
|
||||
return #clean > 0 and start .. "#" .. clean or start
|
||||
end, 1)
|
||||
end
|
||||
|
||||
local do_text = function (text)
|
||||
return text:gsub ('%f[%g]https?://%g+', do_single_url)
|
||||
end
|
||||
|
||||
degesch.hook_irc (function (hook, server, line)
|
||||
local start, message = line:match ("^(.* :)(.*)$")
|
||||
return message and start .. do_text (message) or line
|
||||
end)
|
||||
|
||||
degesch.hook_input (function (hook, buffer, input)
|
||||
return do_text (input)
|
||||
end)
|
||||
Reference in New Issue
Block a user