Compare commits

..

58 Commits

Author SHA1 Message Date
Arnavion
77d73c6351 Added ability to ignore joins, parts and quits of an ignored user.
Mentioned in #500
2016-06-11 15:46:32 -07:00
Arnavion
cadff706e7 Use unsigned int consistently for ignore type, and use IG_* constants instead of numeric literals. 2016-06-11 15:46:32 -07:00
tomek
a031a24cfd Bump version to 2.12.1-2 2016-06-05 11:22:24 +02:00
Erik de Castro Lopo
c698e13c0d Couple of minor const correctness fixes 2016-05-28 16:52:26 +10:00
Erik de Castro Lopo
10e429b85d Remove two un-needed type casts 2016-05-28 16:35:45 +10:00
Patrick Griffis
6554a8d63c servlistgui: Show invalid nick/user on open
It is possible to have an invalid config from a previous upgrade

Fixes #1715
2016-05-16 08:51:18 -04:00
Arnavion
d32aa65bc7 Ignore VS2015 crap. 2016-05-12 22:21:26 -07:00
TingPing
3c329727c7 servlist: Default to UTF-8 on PTNet
Fixes #1697
2016-05-03 20:16:49 -04:00
tomek
e223840fa6 Bump version to 2.12.1 2016-05-01 20:52:05 +02:00
Patrick Griffis
ca6411c591 Bump version to 2.12.1 2016-05-01 14:34:46 -04:00
Patrick Griffis
823ef320a5 lua: Use luaL_checkinteger 2016-04-27 14:55:04 -04:00
Arnavion
fe9da9314c Fixed warning from MSVC that not all branches return a value. 2016-04-27 11:39:29 -07:00
Arnavion
1c73f84f3a installer project needs to depend on lua plugin project. 2016-04-27 11:34:48 -07:00
Patrick Griffis
d995272922 win32: Install doat by default 2016-04-26 12:08:11 -04:00
Patrick Griffis
5b097f560d More minor scrollback loading improvements 2016-04-26 12:06:28 -04:00
Patrick Griffis
f06a38c384 configure: Bundle ax_python_devel.m4
Upstream broke API so older distributions have broken system versions

Fixes #1632
2016-04-19 14:07:27 -04:00
Patrick Griffis
44aa999598 Fix challengeauth lower casing username 2016-04-13 18:47:51 -04:00
Marcel Telka
54c6418d61 Support for older libnotify versions 2016-04-10 21:22:12 -04:00
Patrick Griffis
bd358dd570 win32: Reflect lua path changes in gtk-win32 2016-04-09 12:18:02 -07:00
Patrick Griffis
529ae4cc89 lua: Fix explicit braces warning 2016-04-07 19:02:38 -04:00
Patrick Griffis
5b05271e4c win32: Install lgi with lua plugin 2016-04-07 18:27:43 -07:00
Patrick Griffis
d11b7f258c lua: Minor formating cleanup 2016-04-07 18:27:40 -07:00
Patrick Griffis
0694cb9045 lua: More consistency with Python plugin 2016-04-07 18:27:39 -07:00
Patrick Griffis
8099f23bdf travis: Build on Ubuntu 14.04 2016-04-07 18:27:38 -07:00
Patrick Griffis
a3e1a287ac Bump glib requirement to 2.34
This is still rather old but does drop Ubuntu 12.04 support.
2016-04-07 18:27:37 -07:00
mniip
f501e948ae lua: Some more refactoring. Fix unload hook in the interpreter. 2016-04-07 18:27:30 -07:00
Patrick Griffis
ba6a1190cd lua: More missing statics 2016-04-07 18:27:30 -07:00
Patrick Griffis
4abcd53044 lua: Make better use of GLib
- Use GPtrArray everywhere
- Remove unessary NULL checks
- Make use of g_clear macros
- Use g_str_has_suffix
2016-04-07 18:27:29 -07:00
mniip
2fe52bbf58 lua: Bump version and update copyright year. 2016-04-07 18:27:21 -07:00
mniip
5998696c2a lua: Use glib allocators 2016-04-07 18:27:13 -07:00
mniip
bc9a59d264 lua: Replace some pushnumbers with pushintegers 2016-04-07 18:27:07 -07:00
mniip
5699bf9e65 lua: Error if luaL_newstate returns NULL 2016-04-07 18:26:58 -07:00
Patrick Griffis
c4c1c64f00 travis: Build with Lua 2016-04-07 18:26:47 -07:00
Patrick Griffis
fb7f27fcdd lua: Build on win32 2016-04-03 12:02:04 -07:00
Patrick Griffis
2e2b895ebe lua: Don't used mixed declarations
This requires a lot more cleanup
2016-04-03 11:04:48 -04:00
Patrick Griffis
2e478f1b5a Import lua plugin
Written by @mniip
2016-04-03 10:30:01 -04:00
Patrick Griffis
a77c6df7e2 configure: Place auxiliary files in own dir 2016-03-31 08:01:06 -04:00
Patrick Griffis
19c4adf8ba autogen: Don't copy all files by default 2016-03-31 07:51:08 -04:00
Patrick Griffis
1f48f9dd6f Increase default size of some util windows 2016-03-31 07:21:02 -04:00
Patrick Griffis
b7373f4ddc unix: Open urls in existing instance if supported 2016-03-31 07:02:23 -04:00
Patrick Griffis
9402a31111 Improve help message for /close
Closes #1397
2016-03-30 08:58:25 -04:00
Patrick Griffis
58fb36ee34 Fix warning
Fixes #1533
2016-03-30 08:48:23 -04:00
Patrick Griffis
f656569eb9 plugin: Fix padding for chanopts in channel flags
This is an API break but it didn't really work
properly before anyway.

Fixes #1666
2016-03-30 08:28:51 -04:00
LemonBoy
0635e91dd6 Don't flush the chanopt_list when saving it
Closes #1665
Fixes #1134
2016-03-30 08:11:07 -04:00
Jactry Zeng
5f2d6a3c11 servlistgui: Removes leading and trailing whitespace from hostnames
Closes #1651
2016-03-30 08:07:42 -04:00
Scott Scheiner
356241bdfb url: Add support for ts3server:// uris
Closes #1659
2016-03-30 08:05:32 -04:00
Patrick Griffis
dce6a7612a plugingui: Use full path when unloading/reloading plugins
Mentioned in mniip/hexchat-lua#5
2016-03-29 12:19:19 -04:00
Patrick Griffis
60b3b43f3e Translate chanopt output 2016-03-28 21:31:35 -04:00
Patrick Griffis
6cbcc73a79 chanopt: Ensure values are 0-2
If chanopt was set to any other value it would overwrite
other values in the plugin API for channel flags.
2016-03-28 21:19:39 -04:00
Patrick Griffis
edcd9af47f installer: Use https for Python downloads 2016-03-28 05:10:08 -04:00
Patrick Griffis
dd080fa6f3 Fix building on old glib 2016-03-28 01:36:02 -04:00
Patrick Griffis
bcb4eec754 identd: Fix ipv6 support on Windows 2016-03-28 01:28:56 -04:00
Patrick Griffis
795e97f428 identd: Fix respecting USE_GLOBAL network flag 2016-03-28 00:31:00 -04:00
Patrick Griffis
77ac0863f8 identd: Respond for INVALID-PORT and NO-USER errors 2016-03-27 23:44:05 -04:00
Patrick Griffis
963ba2bf2d identd: Ensure connection is closed 2016-03-27 23:18:24 -04:00
Patrick Griffis
c280029436 servlist: Update DALnet default login type 2016-03-25 18:44:16 -04:00
Patrick Griffis
47b357b2e1 Only intercept QuakeNet challengeauth when enabled 2016-03-24 15:42:49 -04:00
Patrick Griffis
c1a94e2879 servlist: Add GlobalGamers
Closes #1334
2016-03-20 20:47:52 -04:00
47 changed files with 2574 additions and 302 deletions

19
.gitignore vendored
View File

@@ -7,31 +7,19 @@ Makefile
Makefile.in Makefile.in
aclocal.m4 aclocal.m4
autom4te.cache/ autom4te.cache/
compile /build-aux/
ar-lib
confdefs.h confdefs.h
conftest conftest
conftest.c conftest.c
conftest.err conftest.err
config.guess config.*
config.h.in
config.h.in~
config.h
config.log
config.status
config.sub
config-win32.h config-win32.h
configure configure
configure.tmp configure.tmp
depcomp
doxygen*.tmp doxygen*.tmp
html/ html/
install-sh
intl/
libtool libtool
ltmain.sh
m4/ m4/
missing
plugins/perl/irc.pm.h plugins/perl/irc.pm.h
plugins/perl/xchat.pm.h plugins/perl/xchat.pm.h
plugins/perl/hexchat.pm.h plugins/perl/hexchat.pm.h
@@ -44,6 +32,7 @@ data/man/hexchat.1
data/pkgconfig/hexchat-plugin.pc data/pkgconfig/hexchat-plugin.pc
data/misc/hexchat.appdata.xml data/misc/hexchat.appdata.xml
data/misc/hexchat.desktop data/misc/hexchat.desktop
data/misc/hexchat.desktop.in
data/misc/htm.desktop data/misc/htm.desktop
src/common/dbus/example src/common/dbus/example
src/common/dbus/org.hexchat.service.service src/common/dbus/org.hexchat.service.service
@@ -96,3 +85,5 @@ osx/.HexChat.app
po/.intltool-merge-cache po/.intltool-merge-cache
*.zip *.zip
*.dmg *.dmg
*.VC.db
*.VC.opendb

View File

@@ -1,4 +1,5 @@
sudo: false sudo: required
dist: trusty
language: c language: c
cache: apt cache: apt
compiler: clang compiler: clang
@@ -23,6 +24,7 @@ addons:
- libdbus-glib-1-dev - libdbus-glib-1-dev
- libglib2.0-dev - libglib2.0-dev
- libgtk2.0-dev - libgtk2.0-dev
- libluajit-5.1-dev
- libnotify-dev - libnotify-dev
- libpci-dev - libpci-dev
- libperl-dev - libperl-dev

View File

@@ -9,10 +9,15 @@ test -z "$srcdir" && srcdir=.
exit 1 exit 1
} }
aclocal --install -I m4 || exit 1 if [ "$1" = "--copy" ]; then
glib-gettextize --force --copy || exit 1 shift
intltoolize --force --copy --automake || exit 1 aclocal --force --install || exit 1
autoreconf --force --install -Wno-portability || exit 1 intltoolize --force --copy --automake || exit 1
autoreconf --force --install --include=m4 -Wno-portability || exit 1
else
intltoolize --automake || exit 1
autoreconf --install --symlink --include=m4 -Wno-portability || exit 1
fi
if [ "$NOCONFIGURE" = "" ]; then if [ "$NOCONFIGURE" = "" ]; then
$srcdir/configure "$@" || exit 1 $srcdir/configure "$@" || exit 1

View File

@@ -1,6 +1,6 @@
dnl Process this file with autoconf to produce a configure script. dnl Process this file with autoconf to produce a configure script.
AC_INIT([HexChat],[2.12.0]) AC_INIT([HexChat],[2.12.1])
AC_PREREQ([2.64]) AC_PREREQ([2.64])
AC_COPYRIGHT([Copyright (C) 1998-2010 Peter Zelezny]) AC_COPYRIGHT([Copyright (C) 1998-2010 Peter Zelezny])
@@ -9,6 +9,7 @@ AC_CONFIG_HEADERS([config.h])
AC_CONFIG_SRCDIR([configure.ac]) AC_CONFIG_SRCDIR([configure.ac])
AC_CONFIG_MACRO_DIR([m4]) AC_CONFIG_MACRO_DIR([m4])
AC_CONFIG_AUX_DIR([build-aux])
AM_INIT_AUTOMAKE([1.11.1 dist-xz no-dist-gzip subdir-objects no-define foreign]) AM_INIT_AUTOMAKE([1.11.1 dist-xz no-dist-gzip subdir-objects no-define foreign])
AM_SILENT_RULES([yes]) AM_SILENT_RULES([yes])
@@ -117,6 +118,10 @@ AC_ARG_ENABLE(perl,
[AS_HELP_STRING([--disable-perl],[don\'t build the perl plugin])], [AS_HELP_STRING([--disable-perl],[don\'t build the perl plugin])],
perl=$enableval, perl=yes) perl=$enableval, perl=yes)
AC_ARG_ENABLE(lua,
[AS_HELP_STRING([--disable-lua],[don\'t build the lua plugin])],
lua=$enableval, lua=yes)
AC_ARG_ENABLE(perl_old, AC_ARG_ENABLE(perl_old,
[AS_HELP_STRING([--disable-perl_old],[no backwards compatibility for perl plugin])], [AS_HELP_STRING([--disable-perl_old],[no backwards compatibility for perl plugin])],
perl_old=$enableval, perl_old=yes) perl_old=$enableval, perl_old=yes)
@@ -185,11 +190,11 @@ dnl *********************************************************************
dnl ** GLIB ************************************************************* dnl ** GLIB *************************************************************
dnl ********************************************************************* dnl *********************************************************************
AM_PATH_GLIB_2_0([2.32.0], [], [AC_MSG_ERROR([Glib not found!])], [gmodule gobject gio]) AM_PATH_GLIB_2_0([2.34.0], [], [AC_MSG_ERROR([Glib not found!])], [gmodule gobject gio])
COMMON_CFLAGS="$GLIB_CFLAGS -DG_DISABLE_SINGLE_INCLUDES" COMMON_CFLAGS="$GLIB_CFLAGS -DG_DISABLE_SINGLE_INCLUDES"
COMMON_LIBS="$GLIB_LIBS" COMMON_LIBS="$GLIB_LIBS"
AC_DEFINE([GLIB_VERSION_MIN_REQUIRED], [GLIB_VERSION_2_32], [Dont warn using older APIs]) AC_DEFINE([GLIB_VERSION_MIN_REQUIRED], [GLIB_VERSION_2_34], [Dont warn using older APIs])
AC_DEFINE([GLIB_VERSION_MAX_ALLOWED], [GLIB_VERSION_2_32], [Prevents using newer APIs]) AC_DEFINE([GLIB_VERSION_MAX_ALLOWED], [GLIB_VERSION_2_34], [Prevents using newer APIs])
dnl ********************************************************************* dnl *********************************************************************
dnl ** GTK ************************************************************** dnl ** GTK **************************************************************
@@ -217,6 +222,40 @@ AS_IF([test "x$_gdk_tgt" = xquartz], [
]) ])
]) ])
dnl *********************************************************************
dnl ** Lua **************************************************************
dnl *********************************************************************
AS_IF([test "$lua" = yes], [
AC_MSG_CHECKING(for plugin interface used by lua)
AS_IF([test "$plugin" = yes], [
AC_MSG_RESULT([yes])
m4_define_default([_LUA_LIST], [luajit lua lua5.3 lua53 lua5.2 lua52 lua5.1 lua51])
AC_ARG_VAR([LUA], [The Lua pkgconfig name, e.g. luajit or lua5.2])
AS_IF([test "x$LUA" = 'x'], [
for lua_var in _LUA_LIST; do
$PKG_CONFIG --exists $lua_var || continue
LUA=$lua_var
break
done
AS_IF([test "x$LUA" = 'x'], [
AC_MSG_ERROR([Failed to find lua])
])
])
PKG_CHECK_MODULES([LUA], $LUA, [
AC_SUBST([LUA_CFLAGS])
AC_SUBST([LUA_LIBS])
])
], [
AC_MSG_RESULT([plugins are disabled, use the --enable-plugin option for lua])
lua=no
])
])
dnl ********************************************************************* dnl *********************************************************************
dnl ** PERL ************************************************************* dnl ** PERL *************************************************************
dnl ********************************************************************* dnl *********************************************************************
@@ -563,6 +602,7 @@ AM_CONDITIONAL(USE_LIBCANBERRA, test "x$libcanberra" = "xyes")
AM_CONDITIONAL(DO_TEXT, test "x$textfe" = "xyes") AM_CONDITIONAL(DO_TEXT, test "x$textfe" = "xyes")
AM_CONDITIONAL(DO_GTK, test "x$gtkfe" = "xyes") AM_CONDITIONAL(DO_GTK, test "x$gtkfe" = "xyes")
AM_CONDITIONAL(DO_PERL, test "x$perl" = "xyes") AM_CONDITIONAL(DO_PERL, test "x$perl" = "xyes")
AM_CONDITIONAL(DO_LUA, test "x$lua" = "xyes")
AM_CONDITIONAL(DO_PYTHON, test "x$python" != "xno") AM_CONDITIONAL(DO_PYTHON, test "x$python" != "xno")
AM_CONDITIONAL(DO_PLUGIN, test "x$plugin" = "xyes") AM_CONDITIONAL(DO_PLUGIN, test "x$plugin" = "xyes")
AM_CONDITIONAL(DO_CHECKSUM, test "x$checksum" = "xyes") AM_CONDITIONAL(DO_CHECKSUM, test "x$checksum" = "xyes")
@@ -715,6 +755,7 @@ src/htm/Makefile
src/htm/thememan src/htm/thememan
osx/Info.plist osx/Info.plist
plugins/Makefile plugins/Makefile
plugins/lua/Makefile
plugins/python/Makefile plugins/python/Makefile
plugins/perl/Makefile plugins/perl/Makefile
plugins/checksum/Makefile plugins/checksum/Makefile
@@ -740,6 +781,7 @@ echo libcanberra support ... : $libcanberra
echo Plugin interface ...... : $plugin echo Plugin interface ...... : $plugin
echo libproxy support ...... : $libproxy echo libproxy support ...... : $libproxy
echo echo
echo Lua ................... : $lua \($LUA\)
echo Perl .................. : $perl echo Perl .................. : $perl
echo Python ................ : $python echo Python ................ : $python
echo echo

View File

@@ -3,6 +3,15 @@ appdata_DATA = $(appdata_in_files:.xml.in=.xml)
appdatadir = $(datadir)/appdata appdatadir = $(datadir)/appdata
@INTLTOOL_XML_RULE@ @INTLTOOL_XML_RULE@
if USE_DBUS
exec_command = 'hexchat --existing %U'
else
exec_command = 'hexchat %U'
endif
hexchat.desktop.in: hexchat.desktop.in.in
$(AM_V_GEN)sed -e s!\@exec_command\@!$(exec_command)! < $< > $@
data_desktopdir = $(datadir)/applications data_desktopdir = $(datadir)/applications
data_desktop_in_files = hexchat.desktop.in data_desktop_in_files = hexchat.desktop.in
@@ -26,6 +35,6 @@ uninstall-hook:
$(UPDATE_MIME_DATABASE); $(UPDATE_MIME_DATABASE);
$(UPDATE_DESKTOP_DATABASE); $(UPDATE_DESKTOP_DATABASE);
EXTRA_DIST = hexchat.appdata.xml.in hexchat.desktop.in htm.desktop.in htm-mime.xml EXTRA_DIST = hexchat.appdata.xml.in hexchat.desktop.in.in htm.desktop.in htm-mime.xml
CLEANFILES = $(appdata_DATA) $(data_desktop_DATA) CLEANFILES = $(appdata_DATA) $(data_desktop_DATA) hexchat.desktop.in

View File

@@ -3,7 +3,7 @@ _Name=HexChat
_GenericName=IRC Client _GenericName=IRC Client
_Comment=Chat with other people online _Comment=Chat with other people online
_Keywords=IM;Chat; _Keywords=IM;Chat;
Exec=hexchat %U Exec=@exec_command@
Icon=hexchat Icon=hexchat
Terminal=false Terminal=false
Type=Application Type=Application

327
m4/ax_python_devel.m4 Normal file
View File

@@ -0,0 +1,327 @@
# ===========================================================================
# http://www.gnu.org/software/autoconf-archive/ax_python_devel.html
# ===========================================================================
#
# SYNOPSIS
#
# AX_PYTHON_DEVEL([version])
#
# DESCRIPTION
#
# Note: Defines as a precious variable "PYTHON_VERSION". Don't override it
# in your configure.ac.
#
# This macro checks for Python and tries to get the include path to
# 'Python.h'. It provides the $(PYTHON_CPPFLAGS) and $(PYTHON_LIBS) output
# variables. It also exports $(PYTHON_EXTRA_LIBS) and
# $(PYTHON_EXTRA_LDFLAGS) for embedding Python in your code.
#
# You can search for some particular version of Python by passing a
# parameter to this macro, for example ">= '2.3.1'", or "== '2.4'". Please
# note that you *have* to pass also an operator along with the version to
# match, and pay special attention to the single quotes surrounding the
# version number. Don't use "PYTHON_VERSION" for this: that environment
# variable is declared as precious and thus reserved for the end-user.
#
# This macro should work for all versions of Python >= 2.1.0. As an end
# user, you can disable the check for the python version by setting the
# PYTHON_NOVERSIONCHECK environment variable to something else than the
# empty string.
#
# If you need to use this macro for an older Python version, please
# contact the authors. We're always open for feedback.
#
# LICENSE
#
# Copyright (c) 2009 Sebastian Huber <sebastian-huber@web.de>
# Copyright (c) 2009 Alan W. Irwin
# Copyright (c) 2009 Rafael Laboissiere <rafael@laboissiere.net>
# Copyright (c) 2009 Andrew Collier
# Copyright (c) 2009 Matteo Settenvini <matteo@member.fsf.org>
# Copyright (c) 2009 Horst Knorr <hk_classes@knoda.org>
# Copyright (c) 2013 Daniel Mullner <muellner@math.stanford.edu>
#
# This program is free software: you can redistribute it and/or modify it
# under the terms of the GNU General Public License as published by the
# Free Software Foundation, either version 3 of the License, or (at your
# option) any later version.
#
# This program is distributed in the hope that it will be useful, but
# WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
# Public License for more details.
#
# You should have received a copy of the GNU General Public License along
# with this program. If not, see <http://www.gnu.org/licenses/>.
#
# As a special exception, the respective Autoconf Macro's copyright owner
# gives unlimited permission to copy, distribute and modify the configure
# scripts that are the output of Autoconf when processing the Macro. You
# need not follow the terms of the GNU General Public License when using
# or distributing such scripts, even though portions of the text of the
# Macro appear in them. The GNU General Public License (GPL) does govern
# all other use of the material that constitutes the Autoconf Macro.
#
# This special exception to the GPL applies to versions of the Autoconf
# Macro released by the Autoconf Archive. When you make and distribute a
# modified version of the Autoconf Macro, you may extend this special
# exception to the GPL to apply to your modified version as well.
#serial 18
AU_ALIAS([AC_PYTHON_DEVEL], [AX_PYTHON_DEVEL])
AC_DEFUN([AX_PYTHON_DEVEL],[
#
# Allow the use of a (user set) custom python version
#
AC_ARG_VAR([PYTHON_VERSION],[The installed Python
version to use, for example '2.3'. This string
will be appended to the Python interpreter
canonical name.])
AC_PATH_PROG([PYTHON],[python[$PYTHON_VERSION]])
if test -z "$PYTHON"; then
AC_MSG_ERROR([Cannot find python$PYTHON_VERSION in your system path])
PYTHON_VERSION=""
fi
#
# Check for a version of Python >= 2.1.0
#
AC_MSG_CHECKING([for a version of Python >= '2.1.0'])
ac_supports_python_ver=`$PYTHON -c "import sys; \
ver = sys.version.split ()[[0]]; \
print (ver >= '2.1.0')"`
if test "$ac_supports_python_ver" != "True"; then
if test -z "$PYTHON_NOVERSIONCHECK"; then
AC_MSG_RESULT([no])
AC_MSG_FAILURE([
This version of the AC@&t@_PYTHON_DEVEL macro
doesn't work properly with versions of Python before
2.1.0. You may need to re-run configure, setting the
variables PYTHON_CPPFLAGS, PYTHON_LIBS, PYTHON_SITE_PKG,
PYTHON_EXTRA_LIBS and PYTHON_EXTRA_LDFLAGS by hand.
Moreover, to disable this check, set PYTHON_NOVERSIONCHECK
to something else than an empty string.
])
else
AC_MSG_RESULT([skip at user request])
fi
else
AC_MSG_RESULT([yes])
fi
#
# if the macro parameter ``version'' is set, honour it
#
if test -n "$1"; then
AC_MSG_CHECKING([for a version of Python $1])
ac_supports_python_ver=`$PYTHON -c "import sys; \
ver = sys.version.split ()[[0]]; \
print (ver $1)"`
if test "$ac_supports_python_ver" = "True"; then
AC_MSG_RESULT([yes])
else
AC_MSG_RESULT([no])
AC_MSG_ERROR([this package requires Python $1.
If you have it installed, but it isn't the default Python
interpreter in your system path, please pass the PYTHON_VERSION
variable to configure. See ``configure --help'' for reference.
])
PYTHON_VERSION=""
fi
fi
#
# Check if you have distutils, else fail
#
AC_MSG_CHECKING([for the distutils Python package])
ac_distutils_result=`$PYTHON -c "import distutils" 2>&1`
if test -z "$ac_distutils_result"; then
AC_MSG_RESULT([yes])
else
AC_MSG_RESULT([no])
AC_MSG_ERROR([cannot import Python module "distutils".
Please check your Python installation. The error was:
$ac_distutils_result])
PYTHON_VERSION=""
fi
#
# Check for Python include path
#
AC_MSG_CHECKING([for Python include path])
if test -z "$PYTHON_CPPFLAGS"; then
python_path=`$PYTHON -c "import distutils.sysconfig; \
print (distutils.sysconfig.get_python_inc ());"`
plat_python_path=`$PYTHON -c "import distutils.sysconfig; \
print (distutils.sysconfig.get_python_inc (plat_specific=1));"`
if test -n "${python_path}"; then
if test "${plat_python_path}" != "${python_path}"; then
python_path="-I$python_path -I$plat_python_path"
else
python_path="-I$python_path"
fi
fi
PYTHON_CPPFLAGS=$python_path
fi
AC_MSG_RESULT([$PYTHON_CPPFLAGS])
AC_SUBST([PYTHON_CPPFLAGS])
#
# Check for Python library path
#
AC_MSG_CHECKING([for Python library path])
if test -z "$PYTHON_LIBS"; then
# (makes two attempts to ensure we've got a version number
# from the interpreter)
ac_python_version=`cat<<EOD | $PYTHON -
# join all versioning strings, on some systems
# major/minor numbers could be in different list elements
from distutils.sysconfig import *
e = get_config_var('VERSION')
if e is not None:
print(e)
EOD`
if test -z "$ac_python_version"; then
if test -n "$PYTHON_VERSION"; then
ac_python_version=$PYTHON_VERSION
else
ac_python_version=`$PYTHON -c "import sys; \
print (sys.version[[:3]])"`
fi
fi
# Make the versioning information available to the compiler
AC_DEFINE_UNQUOTED([HAVE_PYTHON], ["$ac_python_version"],
[If available, contains the Python version number currently in use.])
# First, the library directory:
ac_python_libdir=`cat<<EOD | $PYTHON -
# There should be only one
import distutils.sysconfig
e = distutils.sysconfig.get_config_var('LIBDIR')
if e is not None:
print (e)
EOD`
# Now, for the library:
ac_python_library=`cat<<EOD | $PYTHON -
import distutils.sysconfig
c = distutils.sysconfig.get_config_vars()
if 'LDVERSION' in c:
print ('python'+c[['LDVERSION']])
else:
print ('python'+c[['VERSION']])
EOD`
# This small piece shamelessly adapted from PostgreSQL python macro;
# credits goes to momjian, I think. I'd like to put the right name
# in the credits, if someone can point me in the right direction... ?
#
if test -n "$ac_python_libdir" -a -n "$ac_python_library"
then
# use the official shared library
ac_python_library=`echo "$ac_python_library" | sed "s/^lib//"`
PYTHON_LIBS="-L$ac_python_libdir -l$ac_python_library"
else
# old way: use libpython from python_configdir
ac_python_libdir=`$PYTHON -c \
"from distutils.sysconfig import get_python_lib as f; \
import os; \
print (os.path.join(f(plat_specific=1, standard_lib=1), 'config'));"`
PYTHON_LIBS="-L$ac_python_libdir -lpython$ac_python_version"
fi
if test -z "PYTHON_LIBS"; then
AC_MSG_ERROR([
Cannot determine location of your Python DSO. Please check it was installed with
dynamic libraries enabled, or try setting PYTHON_LIBS by hand.
])
fi
fi
AC_MSG_RESULT([$PYTHON_LIBS])
AC_SUBST([PYTHON_LIBS])
#
# Check for site packages
#
AC_MSG_CHECKING([for Python site-packages path])
if test -z "$PYTHON_SITE_PKG"; then
PYTHON_SITE_PKG=`$PYTHON -c "import distutils.sysconfig; \
print (distutils.sysconfig.get_python_lib(0,0));"`
fi
AC_MSG_RESULT([$PYTHON_SITE_PKG])
AC_SUBST([PYTHON_SITE_PKG])
#
# libraries which must be linked in when embedding
#
AC_MSG_CHECKING(python extra libraries)
if test -z "$PYTHON_EXTRA_LDFLAGS"; then
PYTHON_EXTRA_LDFLAGS=`$PYTHON -c "import distutils.sysconfig; \
conf = distutils.sysconfig.get_config_var; \
print (conf('LIBS') + ' ' + conf('SYSLIBS'))"`
fi
AC_MSG_RESULT([$PYTHON_EXTRA_LDFLAGS])
AC_SUBST(PYTHON_EXTRA_LDFLAGS)
#
# linking flags needed when embedding
#
AC_MSG_CHECKING(python extra linking flags)
if test -z "$PYTHON_EXTRA_LIBS"; then
PYTHON_EXTRA_LIBS=`$PYTHON -c "import distutils.sysconfig; \
conf = distutils.sysconfig.get_config_var; \
print (conf('LINKFORSHARED'))"`
fi
AC_MSG_RESULT([$PYTHON_EXTRA_LIBS])
AC_SUBST(PYTHON_EXTRA_LIBS)
#
# final check to see if everything compiles alright
#
AC_MSG_CHECKING([consistency of all components of python development environment])
# save current global flags
ac_save_LIBS="$LIBS"
ac_save_LDFLAGS="$LDFLAGS"
ac_save_CPPFLAGS="$CPPFLAGS"
LIBS="$ac_save_LIBS $PYTHON_LIBS $PYTHON_EXTRA_LIBS $PYTHON_EXTRA_LIBS"
LDFLAGS="$ac_save_LDFLAGS $PYTHON_EXTRA_LDFLAGS"
CPPFLAGS="$ac_save_CPPFLAGS $PYTHON_CPPFLAGS"
AC_LANG_PUSH([C])
AC_LINK_IFELSE([
AC_LANG_PROGRAM([[#include <Python.h>]],
[[Py_Initialize();]])
],[pythonexists=yes],[pythonexists=no])
AC_LANG_POP([C])
# turn back to default flags
CPPFLAGS="$ac_save_CPPFLAGS"
LIBS="$ac_save_LIBS"
LDFLAGS="$ac_save_LDFLAGS"
AC_MSG_RESULT([$pythonexists])
if test ! "x$pythonexists" = "xyes"; then
AC_MSG_FAILURE([
Could not link test program to Python. Maybe the main Python library has been
installed in some non-standard library path. If so, pass it to configure,
via the LIBS environment variable.
Example: ./configure LIBS="-L/usr/non-standard-path/python/lib"
============================================================================
ERROR!
You probably have to install the development version of the Python package
for your distribution. The exact name of this package varies among them.
============================================================================
])
PYTHON_VERSION=""
fi
#
# all done!
#
])

View File

@@ -1,3 +1,7 @@
if DO_LUA
lua = lua
endif
if DO_PYTHON if DO_PYTHON
pythondir = python pythondir = python
endif endif
@@ -22,4 +26,4 @@ if DO_SYSINFO
sysinfodir = sysinfo sysinfodir = sysinfo
endif endif
SUBDIRS = $(pythondir) $(perldir) $(checksumdir) $(doatdir) $(fishlimdir) $(sysinfodir) SUBDIRS = $(lua) $(pythondir) $(perldir) $(checksumdir) $(doatdir) $(fishlimdir) $(sysinfodir)

9
plugins/lua/Makefile.am Normal file
View File

@@ -0,0 +1,9 @@
libdir = $(hexchatlibdir)
lib_LTLIBRARIES = lua.la
lua_la_SOURCES = lua.c
lua_la_LDFLAGS = $(PLUGIN_LDFLAGS) -module
lua_la_LIBADD = $(LUA_LIBS) $(GLIB_LIBS)
lua_la_CPPFLAGS = -I$(top_srcdir)/src/common
lua_la_CFLAGS = $(GLIB_CFLAGS) $(LUA_CFLAGS)

1725
plugins/lua/lua.c Normal file

File diff suppressed because it is too large Load Diff

54
plugins/lua/lua.vcxproj Normal file
View File

@@ -0,0 +1,54 @@
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" ToolsVersion="12.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup Label="Configuration">
<PlatformToolset>v140</PlatformToolset>
<ConfigurationType>DynamicLibrary</ConfigurationType>
</PropertyGroup>
<ItemGroup Label="ProjectConfigurations">
<ProjectConfiguration Include="Release|Win32">
<Configuration>Release</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Release|x64">
<Configuration>Release</Configuration>
<Platform>x64</Platform>
</ProjectConfiguration>
</ItemGroup>
<PropertyGroup Label="Globals">
<ProjectGuid>{4C0F3940-2EEE-4646-82F7-6CE75B9A72F4}</ProjectGuid>
<Keyword>Win32Proj</Keyword>
<RootNamespace>lua</RootNamespace>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
<Import Project="..\..\win32\hexchat.props" />
<PropertyGroup>
<TargetName>$(LuaOutput)</TargetName>
<OutDir>$(HexChatRel)plugins\</OutDir>
</PropertyGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<ClCompile>
<PreprocessorDefinitions>WIN32;NDEBUG;_WINDOWS;_USRDLL;$(OwnFlags);%(PreprocessorDefinitions)</PreprocessorDefinitions>
<AdditionalIncludeDirectories>$(Glib);$(LuaInclude);..\..\src\common;$(HexChatLib);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
</ClCompile>
<Link>
<AdditionalDependencies>"$(LuaLib).lib";$(DepLibs);%(AdditionalDependencies)</AdditionalDependencies>
<AdditionalLibraryDirectories>$(DepsRoot)\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<ClCompile>
<PreprocessorDefinitions>WIN32;_WIN64;_AMD64_;NDEBUG;_WINDOWS;_USRDLL;$(OwnFlags);%(PreprocessorDefinitions)</PreprocessorDefinitions>
<AdditionalIncludeDirectories>$(Glib);$(LuaInclude);..\..\src\common;$(HexChatLib);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
</ClCompile>
<Link>
<AdditionalDependencies>"$(LuaLib).lib";$(DepLibs);%(AdditionalDependencies)</AdditionalDependencies>
<AdditionalLibraryDirectories>$(DepsRoot)\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
</Link>
</ItemDefinitionGroup>
<ItemGroup>
<ClCompile Include="lua.c" />
</ItemGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
</Project>

View File

@@ -0,0 +1,14 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup>
<Filter Include="Source Files">
<UniqueIdentifier>{f4eaf231-f095-42d3-8427-b2b6006cacb1}</UniqueIdentifier>
</Filter>
<Filter Include="Resource Files">
<UniqueIdentifier>{0166c0f9-7968-4a09-9ef5-a5179c7746eb}</UniqueIdentifier>
</Filter>
</ItemGroup>
<ItemGroup>
<ClCompile Include="lua.c" />
</ItemGroup>
</Project>

1
po/POTFILES.skip Normal file
View File

@@ -0,0 +1 @@
data/misc/hexchat.desktop.in.in

View File

@@ -76,14 +76,28 @@ chanopt_value (guint8 val)
switch (val) switch (val)
{ {
case SET_OFF: case SET_OFF:
return "OFF"; return _("OFF");
case SET_ON: case SET_ON:
return "ON"; return _("ON");
case SET_DEFAULT:
return _("{unset}");
default: default:
return "{unset}"; g_assert_not_reached ();
return NULL;
} }
} }
static guint8
str_to_chanopt (const char *str)
{
if (!g_ascii_strcasecmp (str, "ON") || !strcmp (str, "1"))
return SET_ON;
else if (!g_ascii_strcasecmp (str, "OFF") || !strcmp (str, "0"))
return SET_OFF;
else
return SET_DEFAULT;
}
/* handle the /CHANOPT command */ /* handle the /CHANOPT command */
int int
@@ -106,19 +120,14 @@ chanopt_command (session *sess, char *tbuf, char *word[], char *word_eol[])
if (word[offset][0]) if (word[offset][0])
{ {
if (!g_ascii_strcasecmp (word[offset], "ON")) newval = str_to_chanopt (word[offset]);
newval = 1;
else if (!g_ascii_strcasecmp (word[offset], "OFF"))
newval = 0;
else if (word[offset][0] == 'u')
newval = SET_DEFAULT;
else
newval = atoi (word[offset]);
} }
if (!quiet) if (!quiet)
PrintTextf (sess, "\002Network\002: %s \002Channel\002: %s\n", PrintTextf (sess, "\002%s\002: %s \002%s\002: %s\n",
_("Network"),
sess->server->network ? server_get_network (sess->server, TRUE) : _("<none>"), sess->server->network ? server_get_network (sess->server, TRUE) : _("<none>"),
_("Channel"),
sess->session_name[0] ? sess->session_name : _("<none>")); sess->session_name[0] ? sess->session_name : _("<none>"));
while (i < sizeof (chanopt) / sizeof (channel_options)) while (i < sizeof (chanopt) / sizeof (channel_options))
@@ -281,7 +290,7 @@ chanopt_load_all (void)
else else
{ {
if (current) if (current)
chanopt_add_opt (current, buf, atoi (eq + 2)); chanopt_add_opt (current, buf, str_to_chanopt (eq + 2));
} }
} }
@@ -388,7 +397,7 @@ chanopt_save_one_channel (chanopt_in_memory *co, int fh)
} }
void void
chanopt_save_all (void) chanopt_save_all (gboolean flush)
{ {
int i; int i;
int num_saved; int num_saved;
@@ -430,15 +439,21 @@ chanopt_save_all (void)
} }
cont: cont:
g_free (co->network); if (flush)
g_free (co->channel); {
g_free (co); g_free (co->network);
g_free (co->channel);
g_free (co);
}
} }
close (fh); close (fh);
g_slist_free (chanopt_list); if (flush)
chanopt_list = NULL; {
g_slist_free (chanopt_list);
chanopt_list = NULL;
}
chanopt_open = FALSE; chanopt_open = FALSE;
chanopt_changed = FALSE; chanopt_changed = FALSE;

View File

@@ -22,7 +22,7 @@
int chanopt_command (session *sess, char *tbuf, char *word[], char *word_eol[]); int chanopt_command (session *sess, char *tbuf, char *word[], char *word_eol[]);
gboolean chanopt_is_set (unsigned int global, guint8 per_chan_setting); gboolean chanopt_is_set (unsigned int global, guint8 per_chan_setting);
void chanopt_save_all (void); void chanopt_save_all (gboolean flush);
void chanopt_save (session *sess); void chanopt_save (session *sess);
void chanopt_load (session *sess); void chanopt_load (session *sess);

View File

@@ -93,7 +93,6 @@ ctcp_handle (session *sess, char *to, char *nick, char *ip,
server *serv = sess->server; server *serv = sess->server;
char outbuf[1024]; char outbuf[1024];
int ctcp_offset = 2; int ctcp_offset = 2;
gboolean fromme = FALSE;
if (serv->have_idmsg && (word[4][1] == '+' || word[4][1] == '-') ) if (serv->have_idmsg && (word[4][1] == '+' || word[4][1] == '-') )
ctcp_offset = 3; ctcp_offset = 3;
@@ -130,10 +129,7 @@ ctcp_handle (session *sess, char *to, char *nick, char *ip,
if (ctcp_check (sess, nick, word, word_eol, word[4] + ctcp_offset)) if (ctcp_check (sess, nick, word, word_eol, word[4] + ctcp_offset))
goto generic; goto generic;
if (!serv->p_cmp (nick, serv->nick)) inbound_action (sess, to, nick, ip, msg + 7, FALSE, id, tags_data);
fromme = TRUE;
inbound_action (sess, to, nick, ip, msg + 7, fromme, FALSE, id, tags_data);
return; return;
} }

View File

@@ -549,10 +549,10 @@ dcc_chat_line (struct DCC *dcc, char *line)
if (po) if (po)
po[0] = 0; po[0] = 0;
inbound_action (sess, dcc->serv->nick, dcc->nick, "", line + 8, FALSE, inbound_action (sess, dcc->serv->nick, dcc->nick, "", line + 8, FALSE,
TRUE, FALSE, &no_tags); FALSE, &no_tags);
} else } else
{ {
inbound_privmsg (dcc->serv, dcc->nick, NULL, "", line, FALSE, &no_tags); inbound_privmsg (dcc->serv, dcc->nick, "", line, FALSE, &no_tags);
} }
g_free (line); g_free (line);
return 0; return 0;

View File

@@ -960,7 +960,7 @@ hexchat_exit (void)
notify_save (); notify_save ();
ignore_save (); ignore_save ();
free_sessions (); free_sessions ();
chanopt_save_all (); chanopt_save_all (TRUE);
servlist_cleanup (); servlist_cleanup ();
fe_exit (); fe_exit ();
} }

View File

@@ -77,7 +77,7 @@ ignore_exists (char *mask)
*/ */
int int
ignore_add (char *mask, int type, gboolean overwrite) ignore_add (char *mask, unsigned int type, gboolean overwrite)
{ {
struct ignore *ig = NULL; struct ignore *ig = NULL;
int change_only = FALSE; int change_only = FALSE;
@@ -151,6 +151,10 @@ ignore_showlist (session *sess)
strcat (tbuf, _("YES ")); strcat (tbuf, _("YES "));
else else
strcat (tbuf, _("NO ")); strcat (tbuf, _("NO "));
if (ig->type & IG_JOINS_PARTS)
strcat (tbuf, _("YES "));
else
strcat (tbuf, _("NO "));
strcat (tbuf, "\n"); strcat (tbuf, "\n");
PrintText (sess, tbuf); PrintText (sess, tbuf);
/*EMIT_SIGNAL (XP_TE_IGNORELIST, sess, ig->mask, 0, 0, 0, 0); */ /*EMIT_SIGNAL (XP_TE_IGNORELIST, sess, ig->mask, 0, 0, 0, 0); */
@@ -200,7 +204,7 @@ ignore_del (char *mask, struct ignore *ig)
/* check if a msg should be ignored by browsing our ignore list */ /* check if a msg should be ignored by browsing our ignore list */
int int
ignore_check (char *host, int type) ignore_check (char *host, unsigned int type)
{ {
struct ignore *ig; struct ignore *ig;
GSList *list = ignore_list; GSList *list = ignore_list;

View File

@@ -36,6 +36,7 @@ extern int ignored_invi;
#define IG_UNIG 32 #define IG_UNIG 32
#define IG_NOSAVE 64 #define IG_NOSAVE 64
#define IG_DCC 128 #define IG_DCC 128
#define IG_JOINS_PARTS 256
struct ignore struct ignore
{ {
@@ -44,10 +45,10 @@ struct ignore
}; };
struct ignore *ignore_exists (char *mask); struct ignore *ignore_exists (char *mask);
int ignore_add (char *mask, int type, gboolean overwrite); int ignore_add (char *mask, unsigned int type, gboolean overwrite);
void ignore_showlist (session *sess); void ignore_showlist (session *sess);
int ignore_del (char *mask, struct ignore *ig); int ignore_del (char *mask, struct ignore *ig);
int ignore_check (char *mask, int type); int ignore_check (char *mask, unsigned int type);
void ignore_load (void); void ignore_load (void);
void ignore_save (void); void ignore_save (void);
void ignore_gui_open (void); void ignore_gui_open (void);

View File

@@ -145,7 +145,7 @@ inbound_open_dialog (server *serv, char *from,
} }
static void static void
inbound_make_idtext (server *serv, char *idtext, int max, gboolean id) inbound_make_idtext (server *serv, char *idtext, int max, int id)
{ {
idtext[0] = 0; idtext[0] = 0;
if (serv->have_idmsg || serv->have_accnotify) if (serv->have_idmsg || serv->have_accnotify)
@@ -163,35 +163,28 @@ inbound_make_idtext (server *serv, char *idtext, int max, gboolean id)
} }
void void
inbound_privmsg (server *serv, char *from, char *to, char *ip, char *text, gboolean id, inbound_privmsg (server *serv, char *from, char *ip, char *text, int id,
const message_tags_data *tags_data) const message_tags_data *tags_data)
{ {
session *sess; session *sess;
struct User *user; struct User *user;
char idtext[64]; char idtext[64];
char *destsess = from; gboolean nodiag = FALSE;
gboolean nodiag = FALSE, fromme = FALSE;
if (to && !serv->p_cmp (from, serv->nick))
{
fromme = TRUE;
destsess = to;
}
sess = find_dialog (serv, from); sess = find_dialog (serv, from);
if (!fromme && (sess || prefs.hex_gui_autoopen_dialog)) if (sess || prefs.hex_gui_autoopen_dialog)
{ {
/*0=ctcp 1=priv will set hex_gui_autoopen_dialog=0 here if flood is detected */ /*0=ctcp 1=priv will set hex_gui_autoopen_dialog=0 here is flud detected */
if (!sess) if (!sess)
{ {
if (flood_check (from, ip, serv, current_sess, 1)) if (flood_check (from, ip, serv, current_sess, 1))
{
/* Create a dialog session */ /* Create a dialog session */
sess = inbound_open_dialog (serv, from, tags_data); sess = inbound_open_dialog (serv, from, tags_data);
}
else else
sess = serv->server_session; sess = serv->server_session;
if (!sess)
return; /* ?? */
} }
if (ip && ip[0]) if (ip && ip[0])
@@ -200,18 +193,11 @@ inbound_privmsg (server *serv, char *from, char *to, char *ip, char *text, gbool
return; return;
} }
sess = find_dialog (serv, destsess); sess = find_session_from_nick (from, serv);
if (!sess) if (!sess)
{ {
if (fromme && prefs.hex_gui_autoopen_dialog) sess = serv->front_session;
{ nodiag = TRUE; /* We don't want it to look like a normal message in front sess */
sess = inbound_open_dialog (serv, destsess, tags_data);
}
else
{
sess = serv->front_session;
nodiag = TRUE; /* We don't want it to look like a normal message in front sess */
}
} }
user = userlist_find (sess, from); user = userlist_find (sess, from);
@@ -224,16 +210,7 @@ inbound_privmsg (server *serv, char *from, char *to, char *ip, char *text, gbool
inbound_make_idtext (serv, idtext, sizeof (idtext), id); inbound_make_idtext (serv, idtext, sizeof (idtext), id);
if (fromme) if (sess->type == SESS_DIALOG && !nodiag)
{
if (sess->type == SESS_DIALOG)
EMIT_SIGNAL_TIMESTAMP (XP_TE_UCHANMSG, sess, from, text, NULL, idtext, 0,
tags_data->timestamp);
else
EMIT_SIGNAL_TIMESTAMP (XP_TE_MSGSEND, sess, to, text, NULL, NULL, 0,
tags_data->timestamp);
}
else if (sess->type == SESS_DIALOG && !nodiag)
EMIT_SIGNAL_TIMESTAMP (XP_TE_DPRIVMSG, sess, from, text, idtext, NULL, 0, EMIT_SIGNAL_TIMESTAMP (XP_TE_DPRIVMSG, sess, from, text, idtext, NULL, 0,
tags_data->timestamp); tags_data->timestamp);
else else
@@ -352,50 +329,48 @@ is_hilight (char *from, char *text, session *sess, server *serv)
void void
inbound_action (session *sess, char *chan, char *from, char *ip, char *text, inbound_action (session *sess, char *chan, char *from, char *ip, char *text,
gboolean fromme, gboolean fake, gboolean id, const message_tags_data *tags_data) int fromme, int id, const message_tags_data *tags_data)
{ {
session *def = sess;
server *serv = sess->server; server *serv = sess->server;
struct User *user; struct User *user;
char nickchar[2] = "\000"; char nickchar[2] = "\000";
char idtext[64]; char idtext[64];
int privaction = FALSE; int privaction = FALSE;
char *destsess = from;
if (fromme) if (!fromme)
destsess = chan;
if (!fake) /* Fake events start in the correct sess. */
{ {
if (is_channel (serv, chan)) if (is_channel (serv, chan))
{ {
sess = find_channel (serv, chan); sess = find_channel (serv, chan);
if (!sess)
{
g_warning ("Got channel action for %s but found no channel session\n", chan);
return; /* There is no sane place to put this */
}
} else } else
{ {
/* it's a private action! */ /* it's a private action! */
privaction = TRUE; privaction = TRUE;
/* find a dialog tab for it */ /* find a dialog tab for it */
sess = find_dialog (serv, destsess); sess = find_dialog (serv, from);
/* if non found, open a new one */ /* if non found, open a new one */
if (!sess && prefs.hex_gui_autoopen_dialog) if (!sess && prefs.hex_gui_autoopen_dialog)
{ {
/* but only if it wouldn't flood */ /* but only if it wouldn't flood */
if (flood_check (destsess, ip, serv, current_sess, 1)) if (flood_check (from, ip, serv, current_sess, 1))
sess = inbound_open_dialog (serv, destsess, tags_data); sess = inbound_open_dialog (serv, from, tags_data);
else else
sess = serv->server_session; sess = serv->server_session;
} }
if (!sess) if (!sess)
{ {
sess = serv->front_session; sess = find_session_from_nick (from, serv);
/* still not good? */
if (!sess)
sess = serv->front_session;
} }
} }
} }
if (!sess)
sess = def;
if (sess != current_tab) if (sess != current_tab)
{ {
if (fromme) if (fromme)
@@ -410,7 +385,7 @@ inbound_action (session *sess, char *chan, char *from, char *ip, char *text,
lastact_update (sess); lastact_update (sess);
} }
user = userlist_find (sess, destsess); user = userlist_find (sess, from);
if (user) if (user)
{ {
nickchar[0] = user->prefix[0]; nickchar[0] = user->prefix[0];
@@ -434,19 +409,8 @@ inbound_action (session *sess, char *chan, char *from, char *ip, char *text,
} }
if (fromme) if (fromme)
{ EMIT_SIGNAL_TIMESTAMP (XP_TE_UACTION, sess, from, text, nickchar, idtext,
if (fake || sess->type == SESS_DIALOG ||
!serv->p_cmp (sess->channel, destsess)) /* Show normally if in correct sess */
EMIT_SIGNAL_TIMESTAMP (XP_TE_UACTION, sess, from, text, nickchar, idtext,
0, tags_data->timestamp); 0, tags_data->timestamp);
else /* There is no Action Send event, so we will just show it as CTCP.. */
{
char *new_text = g_strconcat ("ACTION ", text, NULL);
EMIT_SIGNAL_TIMESTAMP (XP_TE_CTCPSEND, sess, destsess, new_text, NULL, NULL,
0, tags_data->timestamp);
g_free (new_text);
}
}
else if (!privaction) else if (!privaction)
EMIT_SIGNAL_TIMESTAMP (XP_TE_CHANACTION, sess, from, text, nickchar, EMIT_SIGNAL_TIMESTAMP (XP_TE_CHANACTION, sess, from, text, nickchar,
idtext, 0, tags_data->timestamp); idtext, 0, tags_data->timestamp);
@@ -460,7 +424,7 @@ inbound_action (session *sess, char *chan, char *from, char *ip, char *text,
void void
inbound_chanmsg (server *serv, session *sess, char *chan, char *from, inbound_chanmsg (server *serv, session *sess, char *chan, char *from,
char *text, gboolean fromme, gboolean id, char *text, char fromme, int id,
const message_tags_data *tags_data) const message_tags_data *tags_data)
{ {
struct User *user; struct User *user;
@@ -473,18 +437,8 @@ inbound_chanmsg (server *serv, session *sess, char *chan, char *from,
if (chan) if (chan)
{ {
sess = find_channel (serv, chan); sess = find_channel (serv, chan);
if (!sess) if (!sess && !is_channel (serv, chan))
{ sess = find_dialog (serv, chan);
if (is_channel (serv, chan))
{
g_warning ("Got channel message to %s but found no channel session\n", chan);
return;
}
else
{
sess = find_dialog (serv, chan);
}
}
} else } else
{ {
sess = find_dialog (serv, from); sess = find_dialog (serv, from);
@@ -495,16 +449,8 @@ inbound_chanmsg (server *serv, session *sess, char *chan, char *from,
if (sess != current_tab) if (sess != current_tab)
{ {
if (fromme) sess->msg_said = TRUE;
{ sess->new_data = FALSE;
sess->msg_said = FALSE;
sess->new_data = TRUE;
}
else
{
sess->msg_said = TRUE;
sess->new_data = FALSE;
}
lastact_update (sess); lastact_update (sess);
} }
@@ -824,14 +770,15 @@ inbound_topicnew (server *serv, char *nick, char *chan, char *topic,
} }
void void
inbound_join (server *serv, char *chan, char *user, char *ip, char *account, inbound_join (server *serv, char *chan, char *host, char *user, char *ip, char *account,
char *realname, const message_tags_data *tags_data) char *realname, const message_tags_data *tags_data)
{ {
session *sess = find_channel (serv, chan); session *sess = find_channel (serv, chan);
if (sess) if (sess)
{ {
EMIT_SIGNAL_TIMESTAMP (XP_TE_JOIN, sess, user, chan, ip, account, 0, if (!ignore_check(host, IG_JOINS_PARTS))
tags_data->timestamp); EMIT_SIGNAL_TIMESTAMP (XP_TE_JOIN, sess, user, chan, ip, account, 0,
tags_data->timestamp);
userlist_add (sess, user, ip, account, realname, tags_data); userlist_add (sess, user, ip, account, realname, tags_data);
} }
} }
@@ -850,18 +797,19 @@ inbound_kick (server *serv, char *chan, char *user, char *kicker, char *reason,
} }
void void
inbound_part (server *serv, char *chan, char *user, char *ip, char *reason, inbound_part (server *serv, char *chan, char *host, char *user, char *ip, char *reason,
const message_tags_data *tags_data) const message_tags_data *tags_data)
{ {
session *sess = find_channel (serv, chan); session *sess = find_channel (serv, chan);
if (sess) if (sess)
{ {
if (*reason) if (!ignore_check(host, IG_JOINS_PARTS))
EMIT_SIGNAL_TIMESTAMP (XP_TE_PARTREASON, sess, user, ip, chan, reason, if (*reason)
0, tags_data->timestamp); EMIT_SIGNAL_TIMESTAMP (XP_TE_PARTREASON, sess, user, ip, chan, reason,
else 0, tags_data->timestamp);
EMIT_SIGNAL_TIMESTAMP (XP_TE_PART, sess, user, ip, chan, NULL, 0, else
tags_data->timestamp); EMIT_SIGNAL_TIMESTAMP (XP_TE_PART, sess, user, ip, chan, NULL, 0,
tags_data->timestamp);
userlist_remove (sess, user); userlist_remove (sess, user);
} }
} }
@@ -882,7 +830,7 @@ inbound_topictime (server *serv, char *chan, char *nick, time_t stamp,
} }
void void
inbound_quit (server *serv, char *nick, char *ip, char *reason, inbound_quit (server *serv, char *host, char *nick, char *ip, char *reason,
const message_tags_data *tags_data) const message_tags_data *tags_data)
{ {
GSList *list = sess_list; GSList *list = sess_list;
@@ -899,8 +847,9 @@ inbound_quit (server *serv, char *nick, char *ip, char *reason,
was_on_front_session = TRUE; was_on_front_session = TRUE;
if ((user = userlist_find (sess, nick))) if ((user = userlist_find (sess, nick)))
{ {
EMIT_SIGNAL_TIMESTAMP (XP_TE_QUIT, sess, nick, reason, ip, NULL, 0, if (!ignore_check(host, IG_JOINS_PARTS))
tags_data->timestamp); EMIT_SIGNAL_TIMESTAMP (XP_TE_QUIT, sess, nick, reason, ip, NULL, 0,
tags_data->timestamp);
userlist_remove_user (sess, user); userlist_remove_user (sess, user);
} else if (sess->type == SESS_DIALOG && !serv->p_cmp (sess->channel, nick)) } else if (sess->type == SESS_DIALOG && !serv->p_cmp (sess->channel, nick))
{ {
@@ -990,7 +939,7 @@ find_session_from_type (int type, server *serv)
} }
void void
inbound_notice (server *serv, char *to, char *nick, char *msg, char *ip, gboolean id, inbound_notice (server *serv, char *to, char *nick, char *msg, char *ip, int id,
const message_tags_data *tags_data) const message_tags_data *tags_data)
{ {
char *po,*ptr=to; char *po,*ptr=to;
@@ -1778,7 +1727,6 @@ static const char * const supported_caps[] = {
/* ZNC */ /* ZNC */
"znc.in/server-time-iso", "znc.in/server-time-iso",
"znc.in/server-time", "znc.in/server-time",
"znc.in/self-message",
/* Twitch */ /* Twitch */
"twitch.tv/membership", "twitch.tv/membership",

View File

@@ -28,7 +28,7 @@ void inbound_uback (server *serv, const message_tags_data *tags_data);
void inbound_uaway (server *serv, const message_tags_data *tags_data); void inbound_uaway (server *serv, const message_tags_data *tags_data);
void inbound_account (server *serv, char *nick, char *account, void inbound_account (server *serv, char *nick, char *account,
const message_tags_data *tags_data); const message_tags_data *tags_data);
void inbound_part (server *serv, char *chan, char *user, char *ip, char *reason, void inbound_part (server *serv, char *chan, char *host, char *user, char *ip, char *reason,
const message_tags_data *tags_data); const message_tags_data *tags_data);
void inbound_upart (server *serv, char *chan, char *ip, char *reason, void inbound_upart (server *serv, char *chan, char *ip, char *reason,
const message_tags_data *tags_data); const message_tags_data *tags_data);
@@ -37,12 +37,12 @@ void inbound_ukick (server *serv, char *chan, char *kicker, char *reason,
void inbound_kick (server *serv, char *chan, char *user, char *kicker, void inbound_kick (server *serv, char *chan, char *user, char *kicker,
char *reason, const message_tags_data *tags_data); char *reason, const message_tags_data *tags_data);
void inbound_notice (server *serv, char *to, char *nick, char *msg, char *ip, void inbound_notice (server *serv, char *to, char *nick, char *msg, char *ip,
gboolean id, const message_tags_data *tags_data); int id, const message_tags_data *tags_data);
void inbound_quit (server *serv, char *nick, char *ip, char *reason, void inbound_quit (server *serv, char *host, char *nick, char *ip, char *reason,
const message_tags_data *tags_data); const message_tags_data *tags_data);
void inbound_topicnew (server *serv, char *nick, char *chan, char *topic, void inbound_topicnew (server *serv, char *nick, char *chan, char *topic,
const message_tags_data *tags_data); const message_tags_data *tags_data);
void inbound_join (server *serv, char *chan, char *user, char *ip, void inbound_join (server *serv, char *chan, char *host, char *user, char *ip,
char *account, char *realname, char *account, char *realname,
const message_tags_data *tags_data); const message_tags_data *tags_data);
void inbound_ujoin (server *serv, char *chan, char *nick, char *ip, void inbound_ujoin (server *serv, char *chan, char *nick, char *ip,
@@ -76,14 +76,14 @@ void inbound_login_start (session *sess, char *nick, char *servname,
void inbound_login_end (session *sess, char *text, void inbound_login_end (session *sess, char *text,
const message_tags_data *tags_data); const message_tags_data *tags_data);
void inbound_chanmsg (server *serv, session *sess, char *chan, char *from, void inbound_chanmsg (server *serv, session *sess, char *chan, char *from,
char *text, gboolean fromme, gboolean id, char *text, char fromme, int id,
const message_tags_data *tags_data); const message_tags_data *tags_data);
void clear_channel (session *sess); void clear_channel (session *sess);
void set_topic (session *sess, char *topic, char *stripped_topic); void set_topic (session *sess, char *topic, char *stripped_topic);
void inbound_privmsg (server *serv, char *from, char *to, char *ip, char *text, gboolean id, void inbound_privmsg (server *serv, char *from, char *ip, char *text, int id,
const message_tags_data *tags_data); const message_tags_data *tags_data);
void inbound_action (session *sess, char *chan, char *from, char *ip, void inbound_action (session *sess, char *chan, char *from, char *ip,
char *text, gboolean fromme, gboolean fake, gboolean id, char *text, int fromme, int id,
const message_tags_data *tags_data); const message_tags_data *tags_data);
void inbound_newnick (server *serv, char *nick, char *newnick, int quiet, void inbound_newnick (server *serv, char *nick, char *newnick, int quiet,
const message_tags_data *tags_data); const message_tags_data *tags_data);

View File

@@ -162,8 +162,8 @@ process_data_init (char *buf, char *cmd, char *word[],
word[0] = "\000\000"; word[0] = "\000\000";
word_eol[0] = "\000\000"; word_eol[0] = "\000\000";
word[1] = (char *)buf; word[1] = buf;
word_eol[1] = (char *)cmd; word_eol[1] = cmd;
while (1) while (1)
{ {
@@ -581,7 +581,7 @@ cmd_chanopt (struct session *sess, char *tbuf, char *word[], char *word_eol[])
/* chanopt.c */ /* chanopt.c */
ret = chanopt_command (sess, tbuf, word, word_eol); ret = chanopt_command (sess, tbuf, word, word_eol);
chanopt_save_all (); chanopt_save_all (FALSE);
return ret; return ret;
} }
@@ -2642,7 +2642,7 @@ cmd_me (struct session *sess, char *tbuf, char *word[], char *word_eol[])
if (dcc_write_chat (sess->channel, tbuf)) if (dcc_write_chat (sess->channel, tbuf))
{ {
/* print it to screen */ /* print it to screen */
inbound_action (sess, sess->channel, sess->server->nick, "", act, TRUE, TRUE, FALSE, inbound_action (sess, sess->channel, sess->server->nick, "", act, TRUE, FALSE,
&no_tags); &no_tags);
} else } else
{ {
@@ -2654,7 +2654,7 @@ cmd_me (struct session *sess, char *tbuf, char *word[], char *word_eol[])
sess->server->p_action (sess->server, sess->channel, split_text); sess->server->p_action (sess->server, sess->channel, split_text);
/* print it to screen */ /* print it to screen */
inbound_action (sess, sess->channel, sess->server->nick, "", inbound_action (sess, sess->channel, sess->server->nick, "",
split_text, TRUE, TRUE, FALSE, split_text, TRUE, FALSE,
&no_tags); &no_tags);
if (*split_text) if (*split_text)
@@ -2666,7 +2666,7 @@ cmd_me (struct session *sess, char *tbuf, char *word[], char *word_eol[])
sess->server->p_action (sess->server, sess->channel, act + offset); sess->server->p_action (sess->server, sess->channel, act + offset);
/* print it to screen */ /* print it to screen */
inbound_action (sess, sess->channel, sess->server->nick, "", inbound_action (sess, sess->channel, sess->server->nick, "",
act + offset, TRUE, TRUE, FALSE, &no_tags); act + offset, TRUE, FALSE, &no_tags);
} else } else
{ {
notc_msg (sess); notc_msg (sess);
@@ -3869,7 +3869,7 @@ const struct commands xc_cmds[] = {
{"CHANOPT", cmd_chanopt, 0, 0, 1, N_("CHANOPT [-quiet] <variable> [<value>]")}, {"CHANOPT", cmd_chanopt, 0, 0, 1, N_("CHANOPT [-quiet] <variable> [<value>]")},
{"CHARSET", cmd_charset, 0, 0, 1, N_("CHARSET [<encoding>], get or set the encoding used for the current connection")}, {"CHARSET", cmd_charset, 0, 0, 1, N_("CHARSET [<encoding>], get or set the encoding used for the current connection")},
{"CLEAR", cmd_clear, 0, 0, 1, N_("CLEAR [ALL|HISTORY|[-]<amount>], Clears the current text window or command history")}, {"CLEAR", cmd_clear, 0, 0, 1, N_("CLEAR [ALL|HISTORY|[-]<amount>], Clears the current text window or command history")},
{"CLOSE", cmd_close, 0, 0, 1, N_("CLOSE [-m], Closes the current window/tab or all queries")}, {"CLOSE", cmd_close, 0, 0, 1, N_("CLOSE [-m], Closes the current tab, closing the window if this is the only open tab, or with the \"-m\" flag, closes all queries.")},
{"COUNTRY", cmd_country, 0, 0, 1, {"COUNTRY", cmd_country, 0, 0, 1,
N_("COUNTRY [-s] <code|wildcard>, finds a country code, eg: au = australia")}, N_("COUNTRY [-s] <code|wildcard>, finds a country code, eg: au = australia")},

View File

@@ -34,6 +34,32 @@ typedef struct ident_info
gchar *username; gchar *username;
} ident_info; } ident_info;
static void
stream_close_ready (GObject *source, GAsyncResult *res, gpointer userdata)
{
GError *err = NULL;
if (!g_io_stream_close_finish (G_IO_STREAM(source), res, &err))
{
g_warning ("%s", err->message);
g_error_free (err);
}
g_object_unref (source);
}
static void
ident_info_free (ident_info *info)
{
if (G_LIKELY(info))
{
g_io_stream_close_async (G_IO_STREAM(info->conn), G_PRIORITY_DEFAULT,
NULL, stream_close_ready, NULL);
g_free (info->username);
g_free (info);
}
}
static int static int
identd_cleanup_response_cb (gpointer userdata) identd_cleanup_response_cb (gpointer userdata)
{ {
@@ -90,9 +116,7 @@ identd_write_ready (GOutputStream *stream, GAsyncResult *res, ident_info *info)
{ {
g_output_stream_write_finish (stream, res, NULL); g_output_stream_write_finish (stream, res, NULL);
g_free (info->username); ident_info_free (info);
g_object_unref (info->conn);
g_free (info);
} }
static void static void
@@ -116,30 +140,47 @@ identd_read_ready (GDataInputStream *in_stream, GAsyncResult *res, ident_info *i
remote = g_ascii_strtoull (p + 1, NULL, 0); remote = g_ascii_strtoull (p + 1, NULL, 0);
g_free (read_buf); g_free (read_buf);
g_snprintf (buf, sizeof (buf), "%"G_GUINT16_FORMAT", %"G_GUINT16_FORMAT" : ",
(guint16)MIN(local, G_MAXUINT16), (guint16)MIN(remote, G_MAXUINT16));
if (!local || !remote || local > G_MAXUINT16 || remote > G_MAXUINT16) if (!local || !remote || local > G_MAXUINT16 || remote > G_MAXUINT16)
goto cleanup;
info->username = g_strdup (g_hash_table_lookup (responses, GINT_TO_POINTER (local)));
if (!info->username)
goto cleanup;
g_hash_table_remove (responses, GINT_TO_POINTER (local));
if ((sok_addr = g_socket_connection_get_remote_address (info->conn, NULL)))
{ {
GInetAddress *inet_addr; g_strlcat (buf, "ERROR : INVALID-PORT\r\n", sizeof (buf));
gchar *addr; g_debug ("Identd: Recieved invalid port");
}
else
{
info->username = g_hash_table_lookup (responses, GINT_TO_POINTER (local));
if (!info->username)
{
g_strlcat (buf, "ERROR : NO-USER\r\n", sizeof (buf));
g_debug ("Identd: Recieved invalid local port");
}
else
{
const gsize len = strlen (buf);
inet_addr = g_inet_socket_address_get_address (G_INET_SOCKET_ADDRESS (sok_addr)); g_hash_table_steal (responses, GINT_TO_POINTER (local));
addr = g_inet_address_to_string (inet_addr);
hexchat_printf (ph, _("*\tServicing ident request from %s as %s"), addr, info->username); g_snprintf (buf + len, sizeof (buf) - len, "USERID : UNIX : %s\r\n", info->username);
g_object_unref (sok_addr); if ((sok_addr = g_socket_connection_get_remote_address (info->conn, NULL)))
g_object_unref (inet_addr); {
g_free (addr); GInetAddress *inet_addr;
gchar *addr;
inet_addr = g_inet_socket_address_get_address (G_INET_SOCKET_ADDRESS (sok_addr));
addr = g_inet_address_to_string (inet_addr);
hexchat_printf (ph, _("*\tServicing ident request from %s as %s"), addr, info->username);
g_object_unref (sok_addr);
g_object_unref (inet_addr);
g_free (addr);
}
}
} }
g_snprintf (buf, sizeof (buf), "%"G_GUINT16_FORMAT", %"G_GUINT16_FORMAT" : USERID : UNIX : %s\r\n", (guint16)local, (guint16)remote, info->username);
out_stream = g_io_stream_get_output_stream (G_IO_STREAM (info->conn)); out_stream = g_io_stream_get_output_stream (G_IO_STREAM (info->conn));
g_output_stream_write_async (out_stream, buf, strlen (buf), G_PRIORITY_DEFAULT, g_output_stream_write_async (out_stream, buf, strlen (buf), G_PRIORITY_DEFAULT,
NULL, (GAsyncReadyCallback)identd_write_ready, info); NULL, (GAsyncReadyCallback)identd_write_ready, info);
@@ -148,8 +189,7 @@ identd_read_ready (GDataInputStream *in_stream, GAsyncResult *res, ident_info *i
return; return;
cleanup: cleanup:
g_object_unref (info->conn); ident_info_free (info);
g_free (info);
} }
static gboolean static gboolean

View File

@@ -426,14 +426,14 @@ plugin_auto_load_cb (char *filename)
} }
} }
static char * static const char *
plugin_get_libdir (void) plugin_get_libdir (void)
{ {
const char *libdir; const char *libdir;
libdir = g_getenv ("HEXCHAT_LIBDIR"); libdir = g_getenv ("HEXCHAT_LIBDIR");
if (libdir && *libdir) if (libdir && *libdir)
return (char*)libdir; return libdir;
else else
return HEXCHATLIBDIR; return HEXCHATLIBDIR;
} }
@@ -441,7 +441,7 @@ plugin_get_libdir (void)
void void
plugin_auto_load (session *sess) plugin_auto_load (session *sess)
{ {
char *lib_dir; const char *lib_dir;
char *sub_dir; char *sub_dir;
ps = sess; ps = sess;
@@ -455,6 +455,7 @@ plugin_auto_load (session *sess)
for_files (lib_dir, "hcdoat.dll", plugin_auto_load_cb); for_files (lib_dir, "hcdoat.dll", plugin_auto_load_cb);
for_files (lib_dir, "hcexec.dll", plugin_auto_load_cb); for_files (lib_dir, "hcexec.dll", plugin_auto_load_cb);
for_files (lib_dir, "hcfishlim.dll", plugin_auto_load_cb); for_files (lib_dir, "hcfishlim.dll", plugin_auto_load_cb);
for_files(lib_dir, "hclua.dll", plugin_auto_load_cb);
for_files (lib_dir, "hcmpcinfo.dll", plugin_auto_load_cb); for_files (lib_dir, "hcmpcinfo.dll", plugin_auto_load_cb);
for_files (lib_dir, "hcperl.dll", plugin_auto_load_cb); for_files (lib_dir, "hcperl.dll", plugin_auto_load_cb);
for_files (lib_dir, "hcpython2.dll", plugin_auto_load_cb); for_files (lib_dir, "hcpython2.dll", plugin_auto_load_cb);
@@ -1567,6 +1568,14 @@ hexchat_list_int (hexchat_plugin *ph, hexchat_list *xlist, const char *name)
case 0xd1b: /* id */ case 0xd1b: /* id */
return ((struct session *)data)->server->id; return ((struct session *)data)->server->id;
case 0x5cfee87: /* flags */ case 0x5cfee87: /* flags */
/* used if alert_taskbar is unset */ /* 20 */
tmp <<= 1;
tmp |= ((struct session *)data)->alert_taskbar; /* 19 */
tmp <<= 1;
/* used if alert_tray is unset */ /* 18 */
tmp <<= 1;
tmp |= ((struct session *)data)->alert_tray; /* 17 */
tmp <<= 1;
/* used if text_strip is unset */ /* 16 */ /* used if text_strip is unset */ /* 16 */
tmp <<= 1; tmp <<= 1;
tmp |= ((struct session *)data)->text_strip; /* 15 */ tmp |= ((struct session *)data)->text_strip; /* 15 */
@@ -1579,9 +1588,9 @@ hexchat_list_int (hexchat_plugin *ph, hexchat_list *xlist, const char *name)
tmp <<= 1; tmp <<= 1;
tmp |= ((struct session *)data)->text_logging; /* 11 */ tmp |= ((struct session *)data)->text_logging; /* 11 */
tmp <<= 1; tmp <<= 1;
tmp |= ((struct session *)data)->alert_taskbar; /* 10 */ /* unused for historical reasons */ /* 10 */
tmp <<= 1; tmp <<= 1;
tmp |= ((struct session *)data)->alert_tray; /* 9 */ /* used if alert_beep is unset */ /* 9 */
tmp <<= 1; tmp <<= 1;
tmp |= ((struct session *)data)->alert_beep; /* 8 */ tmp |= ((struct session *)data)->alert_beep; /* 8 */
tmp <<= 1; tmp <<= 1;

View File

@@ -1046,8 +1046,8 @@ process_named_msg (session *sess, char *type, char *word[], char *word_eol[],
if (!serv->p_cmp (nick, serv->nick)) if (!serv->p_cmp (nick, serv->nick))
inbound_ujoin (serv, chan, nick, ip, tags_data); inbound_ujoin (serv, chan, nick, ip, tags_data);
else else
inbound_join (serv, chan, nick, ip, account, realname, inbound_join (serv, chan, word[1], nick, ip, account, realname,
tags_data); tags_data);
} }
return; return;
@@ -1100,7 +1100,7 @@ process_named_msg (session *sess, char *type, char *word[], char *word_eol[],
if (!strcmp (nick, serv->nick)) if (!strcmp (nick, serv->nick))
inbound_upart (serv, chan, ip, reason, tags_data); inbound_upart (serv, chan, ip, reason, tags_data);
else else
inbound_part (serv, chan, nick, ip, reason, tags_data); inbound_part (serv, chan, word[1], nick, ip, reason, tags_data);
} }
return; return;
@@ -1115,9 +1115,9 @@ process_named_msg (session *sess, char *type, char *word[], char *word_eol[],
return; return;
case WORDL('Q','U','I','T'): case WORDL('Q','U','I','T'):
inbound_quit (serv, nick, ip, inbound_quit (serv, word[1], nick, ip,
(word_eol[3][0] == ':') ? word_eol[3] + 1 : word_eol[3], (word_eol[3][0] == ':') ? word_eol[3] + 1 : word_eol[3],
tags_data); tags_data);
return; return;
case WORDL('A','W','A','Y'): case WORDL('A','W','A','Y'):
@@ -1178,13 +1178,19 @@ process_named_msg (session *sess, char *type, char *word[], char *word_eol[],
} }
#ifdef USE_OPENSSL #ifdef USE_OPENSSL
if (!strncmp (text, "CHALLENGE ", 10)) /* QuakeNet CHALLENGE upon our request */ /* QuakeNet CHALLENGE upon our request */
if (serv->loginmethod == LOGIN_CHALLENGEAUTH && !serv->p_cmp (word[1], CHALLENGEAUTH_FULLHOST)
&& !strncmp (text, "CHALLENGE ", 10) && *serv->password)
{ {
char *response = challengeauth_response (((ircnet *)serv->network)->user ? ((ircnet *)serv->network)->user : prefs.hex_irc_user_name, serv->password, word[5]); char *response;
ircnet *net = serv->network;
char *user = net && net->user ? net->user : prefs.hex_irc_user_name;
response = challengeauth_response (user, serv->password, word[5]);
tcp_sendf (serv, "PRIVMSG %s :CHALLENGEAUTH %s %s %s\r\n", tcp_sendf (serv, "PRIVMSG %s :CHALLENGEAUTH %s %s %s\r\n",
CHALLENGEAUTH_NICK, CHALLENGEAUTH_NICK,
((ircnet *)serv->network)->user ? ((ircnet *)serv->network)->user : prefs.hex_irc_user_name, user,
response, response,
CHALLENGEAUTH_ALGO); CHALLENGEAUTH_ALGO);
@@ -1256,7 +1262,7 @@ process_named_msg (session *sess, char *type, char *word[], char *word_eol[],
{ {
if (ignore_check (word[1], IG_PRIV)) if (ignore_check (word[1], IG_PRIV))
return; return;
inbound_privmsg (serv, nick, to, ip, text, id, tags_data); inbound_privmsg (serv, nick, ip, text, id, tags_data);
} }
} }
} }

View File

@@ -833,20 +833,21 @@ server_read_child (GIOChannel *source, GIOCondition condition, server *serv)
} }
{ {
struct sockaddr addr; struct sockaddr_storage addr;
int addr_len = sizeof (addr); int addr_len = sizeof (addr);
guint16 port; guint16 port;
ircnet *net = serv->network;
if (!getsockname (serv->sok, &addr, &addr_len)) if (!getsockname (serv->sok, (struct sockaddr *)&addr, &addr_len))
{ {
if (addr.sa_family == AF_INET) if (addr.ss_family == AF_INET)
port = ntohs(((struct sockaddr_in *)&addr)->sin_port); port = ntohs(((struct sockaddr_in *)&addr)->sin_port);
else else
port = ntohs(((struct sockaddr_in6 *)&addr)->sin6_port); port = ntohs(((struct sockaddr_in6 *)&addr)->sin6_port);
g_snprintf (outbuf, sizeof (outbuf), "IDENTD %"G_GUINT16_FORMAT" ", port); g_snprintf (outbuf, sizeof (outbuf), "IDENTD %"G_GUINT16_FORMAT" ", port);
if (serv->network && ((ircnet *)serv->network)->user) if (net && net->user && !(net->flags & FLAG_USE_GLOBAL))
g_strlcat (outbuf, ((ircnet *)serv->network)->user, sizeof (outbuf)); g_strlcat (outbuf, net->user, sizeof (outbuf));
else else
g_strlcat (outbuf, prefs.hex_irc_user_name, sizeof (outbuf)); g_strlcat (outbuf, prefs.hex_irc_user_name, sizeof (outbuf));

View File

@@ -117,7 +117,7 @@ static const struct defaultserver def[] =
/* Self signed */ /* Self signed */
{0, "irc.criten.net"}, {0, "irc.criten.net"},
{"DALnet", 0}, {"DALnet", 0, 0, 0, LOGIN_NICKSERV},
/* Self signed */ /* Self signed */
{0, "us.dal.net"}, {0, "us.dal.net"},
@@ -189,6 +189,12 @@ static const struct defaultserver def[] =
{0, "irc.gimp.org"}, {0, "irc.gimp.org"},
{0, "irc.gnome.org"}, {0, "irc.gnome.org"},
{"GlobalGamers", 0},
#ifdef USE_OPENSSL
{0, "irc.globalgamers.net/+6660"},
#endif
{0, "irc.globalgamers.net"},
{"Hashmark", 0}, {"Hashmark", 0},
{0, "irc.hashmark.net"}, {0, "irc.hashmark.net"},
@@ -266,7 +272,8 @@ static const struct defaultserver def[] =
{"PonyChat", 0, 0, 0, LOGIN_SASL, 0, TRUE}, {"PonyChat", 0, 0, 0, LOGIN_SASL, 0, TRUE},
{0, "irc.ponychat.net"}, {0, "irc.ponychat.net"},
{"PTNet.org", 0, 0, "ISO-8859-1"}, {"PTNet.org", 0},
/* Note that the network suggests ISO-8859-1 but most users ignore this */
{0, "uevora.ptnet.org"}, {0, "uevora.ptnet.org"},
{0, "vianetworks.ptnet.org"}, {0, "vianetworks.ptnet.org"},
@@ -357,42 +364,6 @@ static const struct defaultserver def[] =
GSList *network_list = 0; GSList *network_list = 0;
#if !GLIB_CHECK_VERSION(2,34,0)
#define g_slist_copy_deep servlist_slist_copy_deep
/* FIXME copy-paste from gslist.c, should be dumped sometime */
static GSList*
servlist_slist_copy_deep (GSList *list, GCopyFunc func, gpointer user_data)
{
GSList *new_list = NULL;
if (list)
{
GSList *last;
new_list = g_slice_new (GSList);
if (func)
new_list->data = func (list->data, user_data);
else
new_list->data = list->data;
last = new_list;
list = list->next;
while (list)
{
last->next = g_slice_new (GSList);
last = last->next;
if (func)
last->data = func (list->data, user_data);
else
last->data = list->data;
list = list->next;
}
last->next = NULL;
}
return new_list;
}
#endif
favchannel * favchannel *
servlist_favchan_copy (favchannel *fav) servlist_favchan_copy (favchannel *fav)
{ {

View File

@@ -82,6 +82,7 @@ extern GSList *network_list;
#define CHALLENGEAUTH_ALGO "HMAC-SHA-256" #define CHALLENGEAUTH_ALGO "HMAC-SHA-256"
#define CHALLENGEAUTH_NICK "Q@CServe.quakenet.org" #define CHALLENGEAUTH_NICK "Q@CServe.quakenet.org"
#define CHALLENGEAUTH_FULLHOST "Q!TheQBot@CServe.quakenet.org"
/* DEFAULT_CHARSET is already defined in wingdi.h */ /* DEFAULT_CHARSET is already defined in wingdi.h */
#define IRC_DEFAULT_CHARSET "UTF-8 (Unicode)" #define IRC_DEFAULT_CHARSET "UTF-8 (Unicode)"

View File

@@ -222,7 +222,7 @@ scrollback_load (session *sess)
GDataInputStream *istream; GDataInputStream *istream;
gchar *buf, *text; gchar *buf, *text;
gint lines = 0; gint lines = 0;
time_t stamp; time_t stamp = 0;
if (sess->text_scrollback == SET_DEFAULT) if (sess->text_scrollback == SET_DEFAULT)
{ {
@@ -272,12 +272,19 @@ scrollback_load (session *sess)
* Some don't even have a timestamp * Some don't even have a timestamp
* Some don't have any text at all * Some don't have any text at all
*/ */
if (buf[0] == 'T') if (buf[0] == 'T' && buf[1] == ' ')
{ {
if (sizeof (time_t) == 4) if (sizeof (time_t) == 4)
stamp = g_ascii_strtoull (buf + 2, NULL, 10); stamp = strtoul (buf + 2, NULL, 10);
else else
stamp = g_ascii_strtoull (buf + 2, NULL, 10); /* in case time_t is 64 bits */ stamp = g_ascii_strtoull (buf + 2, NULL, 10); /* in case time_t is 64 bits */
if (G_UNLIKELY(stamp == 0))
{
g_warning ("Invalid timestamp in scrollback file");
continue;
}
text = strchr (buf + 3, ' '); text = strchr (buf + 3, ' ');
if (text && text[1]) if (text && text[1])
{ {
@@ -314,7 +321,7 @@ scrollback_load (session *sess)
/* If its only an encoding error it may be specific to the line */ /* If its only an encoding error it may be specific to the line */
if (g_error_matches (err, G_CONVERT_ERROR, G_CONVERT_ERROR_ILLEGAL_SEQUENCE)) if (g_error_matches (err, G_CONVERT_ERROR, G_CONVERT_ERROR_ILLEGAL_SEQUENCE))
{ {
g_warning ("Invalid utf8 in scrollback file\n"); g_warning ("Invalid utf8 in scrollback file");
g_clear_error (&err); g_clear_error (&err);
continue; continue;
} }
@@ -336,8 +343,7 @@ scrollback_load (session *sess)
if (lines) if (lines)
{ {
text = ctime (&stamp); text = ctime (&stamp);
text[24] = 0; /* get rid of the \n */ buf = g_strdup_printf ("\n*\t%s %s\n", _("Loaded log from"), text);
buf = g_strdup_printf ("\n*\t%s %s\n\n", _("Loaded log from"), text);
fe_print_text (sess, buf, 0, TRUE); fe_print_text (sess, buf, 0, TRUE);
g_free (buf); g_free (buf);
/*EMIT_SIGNAL (XP_TE_GENMSG, sess, "*", buf, NULL, NULL, NULL, 0);*/ /*EMIT_SIGNAL (XP_TE_GENMSG, sess, "*", buf, NULL, NULL, NULL, 0);*/

View File

@@ -469,7 +469,7 @@ pevt_generic_none_help
Ignore Header Ignore Header
XP_TE_IGNOREHEADER XP_TE_IGNOREHEADER
pevt_generic_none_help pevt_generic_none_help
%C16,17 Hostmask PRIV NOTI CHAN CTCP DCC INVI UNIG %C16,17 Hostmask PRIV NOTI CHAN CTCP DCC INVI UNIG JOINS_PARTS
0 0
Ignore Remove Ignore Remove

View File

@@ -533,6 +533,7 @@ struct
{ "spotify", "", URI_PATH }, { "spotify", "", URI_PATH },
{ "lastfm", "/", URI_PATH }, { "lastfm", "/", URI_PATH },
{ "xfire", "", URI_PATH }, { "xfire", "", URI_PATH },
{ "ts3server", "", URI_PATH },
{ NULL, "", 0} { NULL, "", 0}
}; };

View File

@@ -634,7 +634,7 @@ break_while:
} }
void void
for_files (char *dirname, char *mask, void callback (char *file)) for_files (const char *dirname, const char *mask, void callback (char *file))
{ {
GDir *dir; GDir *dir;
const gchar *entry_name; const gchar *entry_name;
@@ -1414,6 +1414,21 @@ str_sha256hash (char *string)
return g_strdup (buf); return g_strdup (buf);
} }
static char *
rfc_strlower (const char *str)
{
size_t i, len = strlen(str);
char *lower = g_new(char, len + 1);
for (i = 0; i < len; ++i)
{
lower[i] = rfc_tolower(str[i]);
}
lower[i] = '\0';
return lower;
}
/** /**
* \brief Generate CHALLENGEAUTH response for QuakeNet login. * \brief Generate CHALLENGEAUTH response for QuakeNet login.
* *
@@ -1430,7 +1445,7 @@ str_sha256hash (char *string)
* <a href="http://stackoverflow.com/questions/242665/understanding-engine-initialization-in-openssl">example 2</a>. * <a href="http://stackoverflow.com/questions/242665/understanding-engine-initialization-in-openssl">example 2</a>.
*/ */
char * char *
challengeauth_response (char *username, char *password, char *challenge) challengeauth_response (const char *username, const char *password, const char *challenge)
{ {
int i; int i;
char *user; char *user;
@@ -1441,8 +1456,7 @@ challengeauth_response (char *username, char *password, char *challenge)
unsigned char *digest; unsigned char *digest;
GString *buf = g_string_new_len (NULL, SHA256_DIGEST_LENGTH * 2); GString *buf = g_string_new_len (NULL, SHA256_DIGEST_LENGTH * 2);
user = g_strdup (username); user = rfc_strlower (username); /* convert username to lowercase as per the RFC */
*user = rfc_tolower (*username); /* convert username to lowercase as per the RFC */
pass = g_strndup (password, 10); /* truncate to 10 characters */ pass = g_strndup (password, 10); /* truncate to 10 characters */
passhash = str_sha256hash (pass); passhash = str_sha256hash (pass);

View File

@@ -41,7 +41,7 @@ char *expand_homedir (char *file);
void path_part (char *file, char *path, int pathlen); void path_part (char *file, char *path, int pathlen);
int match (const char *mask, const char *string); int match (const char *mask, const char *string);
char *file_part (char *file); char *file_part (char *file);
void for_files (char *dirname, char *mask, void callback (char *file)); void for_files (const char *dirname, const char *mask, void callback (char *file));
int rfc_casecmp (const char *, const char *); int rfc_casecmp (const char *, const char *);
int rfc_ncasecmp (char *, char *, int); int rfc_ncasecmp (char *, char *, int);
int buf_get_line (char *, char **, int *, int len); int buf_get_line (char *, char **, int *, int len);
@@ -76,7 +76,7 @@ void canonalize_key (char *key);
int portable_mode (void); int portable_mode (void);
int unity_mode (void); int unity_mode (void);
char *encode_sasl_pass_plain (char *user, char *pass); char *encode_sasl_pass_plain (char *user, char *pass);
char *challengeauth_response (char *username, char *password, char *challenge); char *challengeauth_response (const char *username, const char *password, const char *challenge);
size_t strftime_validated (char *dest, size_t destsize, const char *format, const struct tm *time); size_t strftime_validated (char *dest, size_t destsize, const char *format, const struct tm *time);
gsize strftime_utf8 (char *dest, gsize destsize, const char *format, time_t time); gsize strftime_utf8 (char *dest, gsize destsize, const char *format, time_t time);
#endif #endif

View File

@@ -809,7 +809,7 @@ banlist_opengui (struct session *sess)
sess->server->servername); sess->server->servername);
banl->window = mg_create_generic_tab ("BanList", tbuf, FALSE, banl->window = mg_create_generic_tab ("BanList", tbuf, FALSE,
TRUE, banlist_closegui, banl, 550, 200, &vbox, sess->server); TRUE, banlist_closegui, banl, 700, 300, &vbox, sess->server);
gtkutil_destroy_on_esc (banl->window); gtkutil_destroy_on_esc (banl->window);
gtk_container_set_border_width (GTK_CONTAINER (banl->window), 3); gtk_container_set_border_width (GTK_CONTAINER (banl->window), 3);

View File

@@ -685,6 +685,8 @@ gtkutil_treeview_new (GtkWidget *box, GtkTreeModel *model,
attr, col_id, NULL); attr, col_id, NULL);
} }
gtk_tree_view_append_column (GTK_TREE_VIEW (view), col); gtk_tree_view_append_column (GTK_TREE_VIEW (view), col);
if (title == NULL)
gtk_tree_view_column_set_visible (col, FALSE);
} }
va_end (args); va_end (args);

View File

@@ -40,6 +40,7 @@ enum
CTCP_COLUMN, CTCP_COLUMN,
DCC_COLUMN, DCC_COLUMN,
INVITE_COLUMN, INVITE_COLUMN,
JOINS_PARTS_COLUMN,
UNIGNORE_COLUMN, UNIGNORE_COLUMN,
N_COLUMNS N_COLUMNS
}; };
@@ -58,14 +59,23 @@ get_store (void)
return gtk_tree_view_get_model (g_object_get_data (G_OBJECT (ignorewin), "view")); return gtk_tree_view_get_model (g_object_get_data (G_OBJECT (ignorewin), "view"));
} }
static int static unsigned int
ignore_get_flags (GtkTreeModel *model, GtkTreeIter *iter) ignore_get_flags (GtkTreeModel *model, GtkTreeIter *iter)
{ {
gboolean chan, priv, noti, ctcp, dcc, invi, unig; gboolean chan, priv, noti, ctcp, dcc, invi, joins_parts, unig;
int flags = 0; unsigned int flags = 0;
gtk_tree_model_get (model, iter, 1, &chan, 2, &priv, 3, &noti, gtk_tree_model_get (
4, &ctcp, 5, &dcc, 6, &invi, 7, &unig, -1); model, iter,
CHAN_COLUMN, &chan,
PRIV_COLUMN, &priv,
NOTICE_COLUMN, &noti,
CTCP_COLUMN, &ctcp,
DCC_COLUMN, &dcc,
INVITE_COLUMN, &invi,
JOINS_PARTS_COLUMN, &joins_parts,
UNIGNORE_COLUMN, &unig,
-1);
if (chan) if (chan)
flags |= IG_CHAN; flags |= IG_CHAN;
if (priv) if (priv)
@@ -78,6 +88,8 @@ ignore_get_flags (GtkTreeModel *model, GtkTreeIter *iter)
flags |= IG_DCC; flags |= IG_DCC;
if (invi) if (invi)
flags |= IG_INVI; flags |= IG_INVI;
if (joins_parts)
flags |= IG_JOINS_PARTS;
if (unig) if (unig)
flags |= IG_UNIG; flags |= IG_UNIG;
return flags; return flags;
@@ -89,7 +101,7 @@ mask_edited (GtkCellRendererText *render, gchar *path, gchar *new, gpointer dat)
GtkListStore *store = GTK_LIST_STORE (get_store ()); GtkListStore *store = GTK_LIST_STORE (get_store ());
GtkTreeIter iter; GtkTreeIter iter;
char *old; char *old;
int flags; unsigned int flags;
gtkutil_treemodel_string_to_iter (GTK_TREE_MODEL (store), path, &iter); gtkutil_treemodel_string_to_iter (GTK_TREE_MODEL (store), path, &iter);
gtk_tree_model_get (GTK_TREE_MODEL (store), &iter, 0, &old, -1); gtk_tree_model_get (GTK_TREE_MODEL (store), &iter, 0, &old, -1);
@@ -109,7 +121,6 @@ mask_edited (GtkCellRendererText *render, gchar *path, gchar *new, gpointer dat)
gtk_list_store_set (store, &iter, MASK_COLUMN, new, -1); gtk_list_store_set (store, &iter, MASK_COLUMN, new, -1);
} }
g_free (old); g_free (old);
} }
static void static void
@@ -120,7 +131,7 @@ option_toggled (GtkCellRendererToggle *render, gchar *path, gpointer data)
int col_id = GPOINTER_TO_INT (data); int col_id = GPOINTER_TO_INT (data);
gboolean active; gboolean active;
char *mask; char *mask;
int flags; unsigned int flags;
gtkutil_treemodel_string_to_iter (GTK_TREE_MODEL (store), path, &iter); gtkutil_treemodel_string_to_iter (GTK_TREE_MODEL (store), path, &iter);
@@ -162,6 +173,7 @@ ignore_treeview_new (GtkWidget *box)
CTCP_COLUMN, _("CTCP"), CTCP_COLUMN, _("CTCP"),
DCC_COLUMN, _("DCC"), DCC_COLUMN, _("DCC"),
INVITE_COLUMN, _("Invite"), INVITE_COLUMN, _("Invite"),
JOINS_PARTS_COLUMN, _("Joins & Parts"),
UNIGNORE_COLUMN, _("Unignore"), UNIGNORE_COLUMN, _("Unignore"),
-1); -1);
@@ -233,7 +245,7 @@ ignore_store_new (int cancel, char *mask, gpointer data)
GtkListStore *store = GTK_LIST_STORE (get_store ()); GtkListStore *store = GTK_LIST_STORE (get_store ());
GtkTreeIter iter; GtkTreeIter iter;
GtkTreePath *path; GtkTreePath *path;
int flags = IG_CHAN | IG_PRIV | IG_NOTI | IG_CTCP | IG_DCC | IG_INVI; unsigned int flags = IG_CHAN | IG_PRIV | IG_NOTI | IG_CTCP | IG_DCC | IG_INVI | IG_JOINS_PARTS;
if (cancel) if (cancel)
return; return;
@@ -248,8 +260,18 @@ ignore_store_new (int cancel, char *mask, gpointer data)
gtk_list_store_append (store, &iter); gtk_list_store_append (store, &iter);
/* ignore everything by default */ /* ignore everything by default */
gtk_list_store_set (store, &iter, 0, mask, 1, TRUE, 2, TRUE, 3, TRUE, gtk_list_store_set (
4, TRUE, 5, TRUE, 6, TRUE, 7, FALSE, -1); store, &iter,
MASK_COLUMN, mask,
CHAN_COLUMN, TRUE,
PRIV_COLUMN, TRUE,
NOTICE_COLUMN, TRUE,
CTCP_COLUMN, TRUE,
DCC_COLUMN, TRUE,
INVITE_COLUMN, TRUE,
JOINS_PARTS_COLUMN, TRUE,
UNIGNORE_COLUMN, FALSE,
-1);
/* make sure the new row is visible and selected */ /* make sure the new row is visible and selected */
path = gtk_tree_model_get_path (GTK_TREE_MODEL (store), &iter); path = gtk_tree_model_get_path (GTK_TREE_MODEL (store), &iter);
gtk_tree_view_scroll_to_cell (view, path, NULL, TRUE, 1.0, 0.0); gtk_tree_view_scroll_to_cell (view, path, NULL, TRUE, 1.0, 0.0);
@@ -338,7 +360,7 @@ ignore_gui_open ()
GtkTreeIter iter; GtkTreeIter iter;
GSList *temp = ignore_list; GSList *temp = ignore_list;
char *mask; char *mask;
gboolean private, chan, notice, ctcp, dcc, invite, unignore; gboolean private, chan, notice, ctcp, dcc, invite, joins_parts, unignore;
if (ignorewin) if (ignorewin)
{ {
@@ -349,7 +371,7 @@ ignore_gui_open ()
ignorewin = ignorewin =
mg_create_generic_tab ("IgnoreList", _(DISPLAY_NAME": Ignore list"), mg_create_generic_tab ("IgnoreList", _(DISPLAY_NAME": Ignore list"),
FALSE, TRUE, close_ignore_gui_callback, FALSE, TRUE, close_ignore_gui_callback,
NULL, 600, 256, &vbox, 0); NULL, 700, 300, &vbox, 0);
gtkutil_destroy_on_esc (ignorewin); gtkutil_destroy_on_esc (ignorewin);
view = ignore_treeview_new (vbox); view = ignore_treeview_new (vbox);
@@ -397,6 +419,7 @@ ignore_gui_open ()
ctcp = (ignore->type & IG_CTCP); ctcp = (ignore->type & IG_CTCP);
dcc = (ignore->type & IG_DCC); dcc = (ignore->type & IG_DCC);
invite = (ignore->type & IG_INVI); invite = (ignore->type & IG_INVI);
joins_parts = (ignore->type & IG_JOINS_PARTS);
unignore = (ignore->type & IG_UNIG); unignore = (ignore->type & IG_UNIG);
gtk_list_store_append (store, &iter); gtk_list_store_append (store, &iter);
@@ -408,6 +431,7 @@ ignore_gui_open ()
CTCP_COLUMN, ctcp, CTCP_COLUMN, ctcp,
DCC_COLUMN, dcc, DCC_COLUMN, dcc,
INVITE_COLUMN, invite, INVITE_COLUMN, invite,
JOINS_PARTS_COLUMN, joins_parts,
UNIGNORE_COLUMN, unignore, UNIGNORE_COLUMN, unignore,
-1); -1);

View File

@@ -1514,7 +1514,7 @@ mg_set_guint8 (GtkCheckMenuItem *item, guint8 *setting)
log_open_or_close (sess); log_open_or_close (sess);
chanopt_save (sess); chanopt_save (sess);
chanopt_save_all (); chanopt_save_all (FALSE);
} }
static void static void

View File

@@ -20,6 +20,10 @@
#include <glib.h> #include <glib.h>
#include <libnotify/notify.h> #include <libnotify/notify.h>
#ifndef NOTIFY_CHECK_VERSION
#define NOTIFY_CHECK_VERSION(x,y,z) 0
#endif
static gboolean strip_markup = FALSE; static gboolean strip_markup = FALSE;
void void
@@ -30,8 +34,16 @@ notification_backend_show (const char *title, const char *text)
if (strip_markup) if (strip_markup)
text = g_markup_escape_text (text, -1); text = g_markup_escape_text (text, -1);
#if NOTIFY_CHECK_VERSION(0,7,0)
notification = notify_notification_new (title, text, "hexchat"); notification = notify_notification_new (title, text, "hexchat");
#else
notification = notify_notification_new (title, text, "hexchat", NULL);
#endif
#if NOTIFY_CHECK_VERSION(0,6,0)
notify_notification_set_hint (notification, "desktop-entry", g_variant_new_string ("hexchat")); notify_notification_set_hint (notification, "desktop-entry", g_variant_new_string ("hexchat"));
#else
notify_notification_set_hint_string (notification, "desktop-entry", "hexchat");
#endif
notify_notification_show (notification, NULL); notify_notification_show (notification, NULL);
@@ -45,9 +57,6 @@ notification_backend_init (void)
{ {
GList* server_caps; GList* server_caps;
if (!NOTIFY_CHECK_VERSION (0, 7, 0))
return 0;
if (!notify_init (PACKAGE_NAME)) if (!notify_init (PACKAGE_NAME))
return 0; return 0;

View File

@@ -42,6 +42,7 @@ enum
VERSION_COLUMN, VERSION_COLUMN,
FILE_COLUMN, FILE_COLUMN,
DESC_COLUMN, DESC_COLUMN,
FILEPATH_COLUMN,
N_COLUMNS N_COLUMNS
}; };
@@ -57,13 +58,14 @@ plugingui_treeview_new (GtkWidget *box)
int col_id; int col_id;
store = gtk_list_store_new (N_COLUMNS, G_TYPE_STRING, G_TYPE_STRING, store = gtk_list_store_new (N_COLUMNS, G_TYPE_STRING, G_TYPE_STRING,
G_TYPE_STRING, G_TYPE_STRING); G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING);
g_return_val_if_fail (store != NULL, NULL); g_return_val_if_fail (store != NULL, NULL);
view = gtkutil_treeview_new (box, GTK_TREE_MODEL (store), NULL, view = gtkutil_treeview_new (box, GTK_TREE_MODEL (store), NULL,
NAME_COLUMN, _("Name"), NAME_COLUMN, _("Name"),
VERSION_COLUMN, _("Version"), VERSION_COLUMN, _("Version"),
FILE_COLUMN, _("File"), FILE_COLUMN, _("File"),
DESC_COLUMN, _("Description"), -1); DESC_COLUMN, _("Description"),
FILEPATH_COLUMN, NULL, -1);
gtk_tree_view_set_rules_hint (GTK_TREE_VIEW (view), TRUE); gtk_tree_view_set_rules_hint (GTK_TREE_VIEW (view), TRUE);
for (col_id=0; (col = gtk_tree_view_get_column (GTK_TREE_VIEW (view), col_id)); for (col_id=0; (col = gtk_tree_view_get_column (GTK_TREE_VIEW (view), col_id));
col_id++) col_id++)
@@ -86,7 +88,7 @@ plugingui_getfilename (GtkTreeView *view)
sel = gtk_tree_view_get_selection (view); sel = gtk_tree_view_get_selection (view);
if (gtk_tree_selection_get_selected (sel, &model, &iter)) if (gtk_tree_selection_get_selected (sel, &model, &iter))
{ {
gtk_tree_model_get_value (model, &iter, FILE_COLUMN, &file); gtk_tree_model_get_value (model, &iter, FILEPATH_COLUMN, &file);
str = g_value_dup_string (&file); str = g_value_dup_string (&file);
g_value_unset (&file); g_value_unset (&file);
@@ -131,7 +133,8 @@ fe_pluginlist_update (void)
gtk_list_store_set (store, &iter, NAME_COLUMN, pl->name, gtk_list_store_set (store, &iter, NAME_COLUMN, pl->name,
VERSION_COLUMN, pl->version, VERSION_COLUMN, pl->version,
FILE_COLUMN, file_part (pl->filename), FILE_COLUMN, file_part (pl->filename),
DESC_COLUMN, pl->desc, -1); DESC_COLUMN, pl->desc,
FILEPATH_COLUMN, pl->filename, -1);
} }
list = list->next; list = list->next;
} }
@@ -179,7 +182,7 @@ plugingui_unload (GtkWidget * wid, gpointer unused)
view = g_object_get_data (G_OBJECT (plugin_window), "view"); view = g_object_get_data (G_OBJECT (plugin_window), "view");
if (!gtkutil_treeview_get_selected (view, &iter, NAME_COLUMN, &modname, if (!gtkutil_treeview_get_selected (view, &iter, NAME_COLUMN, &modname,
FILE_COLUMN, &file, -1)) FILEPATH_COLUMN, &file, -1))
return; return;
if (g_str_has_suffix (file, "."G_MODULE_SUFFIX)) if (g_str_has_suffix (file, "."G_MODULE_SUFFIX))
@@ -236,7 +239,7 @@ plugingui_open (void)
plugin_window = mg_create_generic_tab ("Addons", _(DISPLAY_NAME": Plugins and Scripts"), plugin_window = mg_create_generic_tab ("Addons", _(DISPLAY_NAME": Plugins and Scripts"),
FALSE, TRUE, plugingui_close, NULL, FALSE, TRUE, plugingui_close, NULL,
500, 250, &vbox, 0); 700, 300, &vbox, 0);
gtkutil_destroy_on_esc (plugin_window); gtkutil_destroy_on_esc (plugin_window);
view = plugingui_treeview_new (vbox); view = plugingui_treeview_new (vbox);

View File

@@ -1319,7 +1319,7 @@ servlist_sanitize_hostname (char *host)
if (c && c == e) if (c && c == e)
*c = '/'; *c = '/';
return ret; return g_strstrip(ret);
} }
/* remove leading slash */ /* remove leading slash */
@@ -2198,6 +2198,10 @@ servlist_open_networks (void)
g_signal_connect (G_OBJECT (entry_nick2), "changed", g_signal_connect (G_OBJECT (entry_nick2), "changed",
G_CALLBACK(servlist_nick_changed_cb), button_connect); G_CALLBACK(servlist_nick_changed_cb), button_connect);
/* Run validity checks now */
servlist_nick_changed_cb (GTK_ENTRY(entry_nick2), button_connect);
servlist_username_changed_cb (GTK_ENTRY(entry_guser), button_connect);
gtk_label_set_mnemonic_widget (GTK_LABEL (label3), entry1); gtk_label_set_mnemonic_widget (GTK_LABEL (label3), entry1);
gtk_label_set_mnemonic_widget (GTK_LABEL (label6), entry4); gtk_label_set_mnemonic_widget (GTK_LABEL (label6), entry4);
/* gtk_label_set_mnemonic_widget (GTK_LABEL (label7), entry5); */ /* gtk_label_set_mnemonic_widget (GTK_LABEL (label7), entry5); */

View File

@@ -1410,7 +1410,7 @@ sexy_spell_entry_activate_language(SexySpellEntry *entry, const gchar *lang, GEr
g_return_val_if_fail(entry != NULL, FALSE); g_return_val_if_fail(entry != NULL, FALSE);
g_return_val_if_fail(SEXY_IS_SPELL_ENTRY(entry), FALSE); g_return_val_if_fail(SEXY_IS_SPELL_ENTRY(entry), FALSE);
g_return_val_if_fail(lang != NULL && lang != '\0', FALSE); g_return_val_if_fail(lang != NULL && *lang != '\0', FALSE);
if (!have_enchant) if (!have_enchant)
return FALSE; return FALSE;

View File

@@ -41,6 +41,7 @@
<None Include="$(DepsRoot)\bin\iconv.dll" /> <None Include="$(DepsRoot)\bin\iconv.dll" />
<None Include="$(DepsRoot)\bin\libeay32.dll" /> <None Include="$(DepsRoot)\bin\libeay32.dll" />
<None Include="$(DepsRoot)\bin\libenchant.dll" /> <None Include="$(DepsRoot)\bin\libenchant.dll" />
<None Include="$(DepsRoot)\bin\libffi.dll" />
<None Include="$(DepsRoot)\bin\libintl.dll" /> <None Include="$(DepsRoot)\bin\libintl.dll" />
<None Include="$(DepsRoot)\bin\libpng16.dll" /> <None Include="$(DepsRoot)\bin\libpng16.dll" />
<None Include="$(DepsRoot)\bin\libxml2.dll" /> <None Include="$(DepsRoot)\bin\libxml2.dll" />
@@ -56,6 +57,14 @@
<None Include="changelog.url" /> <None Include="changelog.url" />
<None Include="readme.url" /> <None Include="readme.url" />
<None Include="$(DepsRoot)\bin\lua51.dll" />
<None Include="$(DepsRoot)\bin\girepository-1.0.dll" />
<LuaLib Include="$(DepsRoot)\lib\lua\**\*.dll" />
<LuaShare Include="$(DepsRoot)\share\lua\*.lua" />
<LuaShare Include="$(DepsRoot)\share\lua\**\*.lua" />
<LuaShare Include="$(DepsRoot)\share\lua\**\**\*.lua" />
<Typelib Include="$(DepsRoot)\lib\girepository-1.0\*.typelib" />
<Engines Include="$(DepsRoot)\lib\gtk-2.0\i686-pc-vs14\engines\**\*" /> <Engines Include="$(DepsRoot)\lib\gtk-2.0\i686-pc-vs14\engines\**\*" />
<Share Include="share\**\*" /> <Share Include="share\**\*" />
@@ -77,6 +86,9 @@
<Copy SourceFiles="$(DepsRoot)\lib\enchant\libenchant_myspell.dll" DestinationFolder="$(HexChatRel)\lib\enchant" /> <Copy SourceFiles="$(DepsRoot)\lib\enchant\libenchant_myspell.dll" DestinationFolder="$(HexChatRel)\lib\enchant" />
<Copy SourceFiles="@(Locale)" DestinationFiles="@(Locale->'$(HexChatRel)\share\locale\%(RecursiveDir)%(Filename)%(Extension)')" /> <Copy SourceFiles="@(Locale)" DestinationFiles="@(Locale->'$(HexChatRel)\share\locale\%(RecursiveDir)%(Filename)%(Extension)')" />
<Copy SourceFiles="@(MSWindowsTheme)" DestinationFiles="@(MSWindowsTheme->'$(HexChatRel)\share\themes\MS-Windows\%(RecursiveDir)%(Filename)%(Extension)')" /> <Copy SourceFiles="@(MSWindowsTheme)" DestinationFiles="@(MSWindowsTheme->'$(HexChatRel)\share\themes\MS-Windows\%(RecursiveDir)%(Filename)%(Extension)')" />
<Copy SourceFiles="@(LuaShare)" DestinationFiles="@(LuaShare->'$(HexChatRel)\share\lua\%(RecursiveDir)%(Filename)%(Extension)')" />
<Copy SourceFiles="@(LuaLib)" DestinationFiles="@(LuaLib->'$(HexChatRel)\lib\lua\%(RecursiveDir)%(Filename)%(Extension)')" />
<Copy SourceFiles="@(Typelib)" DestinationFiles="@(Typelib->'$(HexChatRel)\lib\girepository-1.0\%(Filename)%(Extension)')" />
<WriteLinesToFile File="$(HexChatRel)portable-mode" Lines="2" Overwrite="true" /> <WriteLinesToFile File="$(HexChatRel)portable-mode" Lines="2" Overwrite="true" />
</Target> </Target>

View File

@@ -29,6 +29,9 @@
<Python3Path>$(YourPython3Path)\$(PlatformName)</Python3Path> <Python3Path>$(YourPython3Path)\$(PlatformName)</Python3Path>
<Python3Lib>python35</Python3Lib> <Python3Lib>python35</Python3Lib>
<Python3Output>hcpython3</Python3Output> <Python3Output>hcpython3</Python3Output>
<LuaInclude>$(DepsRoot)\include\luajit-2.0</LuaInclude>
<LuaOutput>hclua</LuaOutput>
<LuaLib>lua51</LuaLib>
<Glib>$(DepsRoot)\include\glib-2.0;$(DepsRoot)\lib\glib-2.0\include;$(DepsRoot)\include\libxml2</Glib> <Glib>$(DepsRoot)\include\glib-2.0;$(DepsRoot)\lib\glib-2.0\include;$(DepsRoot)\include\libxml2</Glib>
<Gtk>$(DepsRoot)\include\gtk-2.0;$(DepsRoot)\lib\gtk-2.0\include;$(DepsRoot)\include\atk-1.0;$(DepsRoot)\include\cairo;$(DepsRoot)\include\pango-1.0;$(DepsRoot)\include\gdk-pixbuf-2.0</Gtk> <Gtk>$(DepsRoot)\include\gtk-2.0;$(DepsRoot)\lib\gtk-2.0\include;$(DepsRoot)\include\atk-1.0;$(DepsRoot)\include\cairo;$(DepsRoot)\include\pango-1.0;$(DepsRoot)\include\gdk-pixbuf-2.0</Gtk>
<DepLibs>gtk-win32-2.0.lib;gdk-win32-2.0.lib;atk-1.0.lib;gio-2.0.lib;gdk_pixbuf-2.0.lib;pangowin32-1.0.lib;pangocairo-1.0.lib;pango-1.0.lib;cairo.lib;gobject-2.0.lib;gmodule-2.0.lib;glib-2.0.lib;libintl.lib;libxml2.lib;libeay32.lib;ssleay32.lib;wininet.lib;winmm.lib;ws2_32.lib</DepLibs> <DepLibs>gtk-win32-2.0.lib;gdk-win32-2.0.lib;atk-1.0.lib;gio-2.0.lib;gdk_pixbuf-2.0.lib;pangowin32-1.0.lib;pangocairo-1.0.lib;pango-1.0.lib;cairo.lib;gobject-2.0.lib;gmodule-2.0.lib;glib-2.0.lib;libintl.lib;libxml2.lib;libeay32.lib;ssleay32.lib;wininet.lib;winmm.lib;ws2_32.lib</DepLibs>

View File

@@ -1,7 +1,7 @@
 
Microsoft Visual Studio Solution File, Format Version 12.00 Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio 2013 # Visual Studio 14
VisualStudioVersion = 12.0.30501.0 VisualStudioVersion = 14.0.25123.0
MinimumVisualStudioVersion = 10.0.40219.1 MinimumVisualStudioVersion = 10.0.40219.1
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "common", "..\src\common\common.vcxproj", "{87554B59-006C-4D94-9714-897B27067BA3}" Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "common", "..\src\common\common.vcxproj", "{87554B59-006C-4D94-9714-897B27067BA3}"
ProjectSection(ProjectDependencies) = postProject ProjectSection(ProjectDependencies) = postProject
@@ -89,6 +89,7 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "installer", "installer\inst
{BF0EBC16-68AD-4CD1-864C-5B56836EBE2A} = {BF0EBC16-68AD-4CD1-864C-5B56836EBE2A} {BF0EBC16-68AD-4CD1-864C-5B56836EBE2A} = {BF0EBC16-68AD-4CD1-864C-5B56836EBE2A}
{4980AF24-9D42-427D-A8E6-0DF3B97C455D} = {4980AF24-9D42-427D-A8E6-0DF3B97C455D} {4980AF24-9D42-427D-A8E6-0DF3B97C455D} = {4980AF24-9D42-427D-A8E6-0DF3B97C455D}
{17E4BE39-76F7-4A06-AD21-EFD0C5091F76} = {17E4BE39-76F7-4A06-AD21-EFD0C5091F76} {17E4BE39-76F7-4A06-AD21-EFD0C5091F76} = {17E4BE39-76F7-4A06-AD21-EFD0C5091F76}
{4C0F3940-2EEE-4646-82F7-6CE75B9A72F4} = {4C0F3940-2EEE-4646-82F7-6CE75B9A72F4}
{B10A2C41-344C-43E0-A32D-B9587C198D8B} = {B10A2C41-344C-43E0-A32D-B9587C198D8B} {B10A2C41-344C-43E0-A32D-B9587C198D8B} = {B10A2C41-344C-43E0-A32D-B9587C198D8B}
{461DC24A-A410-4171-8C02-CCDBF3702C2A} = {461DC24A-A410-4171-8C02-CCDBF3702C2A} {461DC24A-A410-4171-8C02-CCDBF3702C2A} = {461DC24A-A410-4171-8C02-CCDBF3702C2A}
{E93E1255-95D1-4B08-8FDF-B53CC6A21280} = {E93E1255-95D1-4B08-8FDF-B53CC6A21280} {E93E1255-95D1-4B08-8FDF-B53CC6A21280} = {E93E1255-95D1-4B08-8FDF-B53CC6A21280}
@@ -131,6 +132,8 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libenchant_win8", "..\src\l
{87554B59-006C-4D94-9714-897B27067BA3} = {87554B59-006C-4D94-9714-897B27067BA3} {87554B59-006C-4D94-9714-897B27067BA3} = {87554B59-006C-4D94-9714-897B27067BA3}
EndProjectSection EndProjectSection
EndProject EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "lua", "..\plugins\lua\lua.vcxproj", "{4C0F3940-2EEE-4646-82F7-6CE75B9A72F4}"
EndProject
Global Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution GlobalSection(SolutionConfigurationPlatforms) = preSolution
Release|Win32 = Release|Win32 Release|Win32 = Release|Win32
@@ -221,6 +224,10 @@ Global
{BF0EBC16-68AD-4CD1-864C-5B56836EBE2A}.Release|Win32.Build.0 = Release|Win32 {BF0EBC16-68AD-4CD1-864C-5B56836EBE2A}.Release|Win32.Build.0 = Release|Win32
{BF0EBC16-68AD-4CD1-864C-5B56836EBE2A}.Release|x64.ActiveCfg = Release|x64 {BF0EBC16-68AD-4CD1-864C-5B56836EBE2A}.Release|x64.ActiveCfg = Release|x64
{BF0EBC16-68AD-4CD1-864C-5B56836EBE2A}.Release|x64.Build.0 = Release|x64 {BF0EBC16-68AD-4CD1-864C-5B56836EBE2A}.Release|x64.Build.0 = Release|x64
{4C0F3940-2EEE-4646-82F7-6CE75B9A72F4}.Release|Win32.ActiveCfg = Release|Win32
{4C0F3940-2EEE-4646-82F7-6CE75B9A72F4}.Release|Win32.Build.0 = Release|Win32
{4C0F3940-2EEE-4646-82F7-6CE75B9A72F4}.Release|x64.ActiveCfg = Release|x64
{4C0F3940-2EEE-4646-82F7-6CE75B9A72F4}.Release|x64.Build.0 = Release|x64
EndGlobalSection EndGlobalSection
GlobalSection(SolutionProperties) = preSolution GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE HideSolutionNode = FALSE
@@ -247,5 +254,6 @@ Global
{C2321A03-0BA7-45B3-8740-ABD82B36B0BF} = {D237DA6B-BD5F-46C0-8BEA-50E9A1340240} {C2321A03-0BA7-45B3-8740-ABD82B36B0BF} = {D237DA6B-BD5F-46C0-8BEA-50E9A1340240}
{C53145CC-D021-40C9-B97C-0249AB9A43C9} = {561126F4-FA18-45FC-A2BF-8F858F161D6D} {C53145CC-D021-40C9-B97C-0249AB9A43C9} = {561126F4-FA18-45FC-A2BF-8F858F161D6D}
{BF0EBC16-68AD-4CD1-864C-5B56836EBE2A} = {021EC1D0-FF67-4700-9AB2-EAABF1159C09} {BF0EBC16-68AD-4CD1-864C-5B56836EBE2A} = {021EC1D0-FF67-4700-9AB2-EAABF1159C09}
{4C0F3940-2EEE-4646-82F7-6CE75B9A72F4} = {D237DA6B-BD5F-46C0-8BEA-50E9A1340240}
EndGlobalSection EndGlobalSection
EndGlobal EndGlobal

View File

@@ -64,7 +64,7 @@ Name: "translations"; Description: "Translations"; Types: normal custom; Flags:
Name: "spell"; Description: "Spelling Dictionaries"; Types: custom; Flags: disablenouninstallwarning Name: "spell"; Description: "Spelling Dictionaries"; Types: custom; Flags: disablenouninstallwarning
Name: "plugins"; Description: "Plugins"; Types: custom; Flags: disablenouninstallwarning Name: "plugins"; Description: "Plugins"; Types: custom; Flags: disablenouninstallwarning
Name: "plugins\checksum"; Description: "Checksum"; Types: custom; Flags: disablenouninstallwarning Name: "plugins\checksum"; Description: "Checksum"; Types: custom; Flags: disablenouninstallwarning
Name: "plugins\doat"; Description: "Do At"; Types: custom; Flags: disablenouninstallwarning Name: "plugins\doat"; Description: "Do At"; Types: normal custom; Flags: disablenouninstallwarning
Name: "plugins\exec"; Description: "Exec"; Types: custom; Flags: disablenouninstallwarning Name: "plugins\exec"; Description: "Exec"; Types: custom; Flags: disablenouninstallwarning
Name: "plugins\fishlim"; Description: "FiSHLiM"; Types: custom; Flags: disablenouninstallwarning Name: "plugins\fishlim"; Description: "FiSHLiM"; Types: custom; Flags: disablenouninstallwarning
Name: "plugins\mpcinfo"; Description: "mpcInfo"; Types: custom; Flags: disablenouninstallwarning Name: "plugins\mpcinfo"; Description: "mpcInfo"; Types: custom; Flags: disablenouninstallwarning
@@ -72,6 +72,7 @@ Name: "plugins\sysinfo"; Description: "SysInfo"; Types: custom; Flags: disableno
Name: "plugins\upd"; Description: "Update Checker"; Types: normal custom; Flags: disablenouninstallwarning Name: "plugins\upd"; Description: "Update Checker"; Types: normal custom; Flags: disablenouninstallwarning
Name: "plugins\winamp"; Description: "Winamp"; Types: custom; Flags: disablenouninstallwarning Name: "plugins\winamp"; Description: "Winamp"; Types: custom; Flags: disablenouninstallwarning
Name: "langs"; Description: "Language Interfaces"; Types: custom; Flags: disablenouninstallwarning Name: "langs"; Description: "Language Interfaces"; Types: custom; Flags: disablenouninstallwarning
Name: "langs\lua"; Description: "Lua"; Types: normal custom; Flags: disablenouninstallwarning
Name: "langs\perl"; Description: "Perl (requires Perl 5.20)"; Types: custom; Flags: disablenouninstallwarning Name: "langs\perl"; Description: "Perl (requires Perl 5.20)"; Types: custom; Flags: disablenouninstallwarning
Name: "langs\python"; Description: "Python Interface"; Types: custom; Flags: disablenouninstallwarning Name: "langs\python"; Description: "Python Interface"; Types: custom; Flags: disablenouninstallwarning
Name: "langs\python\python2"; Description: "Python (requires Python 2.7)"; Types: custom; Flags: disablenouninstallwarning exclusive Name: "langs\python\python2"; Description: "Python (requires Python 2.7)"; Types: custom; Flags: disablenouninstallwarning exclusive
@@ -138,6 +139,7 @@ Source: "harfbuzz.dll"; DestDir: "{app}"; Flags: ignoreversion; Components: libs
Source: "iconv.dll"; DestDir: "{app}"; Flags: ignoreversion; Components: libs Source: "iconv.dll"; DestDir: "{app}"; Flags: ignoreversion; Components: libs
Source: "libeay32.dll"; DestDir: "{app}"; Flags: ignoreversion; Components: libs Source: "libeay32.dll"; DestDir: "{app}"; Flags: ignoreversion; Components: libs
Source: "libenchant.dll"; DestDir: "{app}"; Flags: ignoreversion; Components: libs Source: "libenchant.dll"; DestDir: "{app}"; Flags: ignoreversion; Components: libs
Source: "libffi.dll"; DestDir: "{app}"; Flags: ignoreversion; Components: libs
Source: "libintl.dll"; DestDir: "{app}"; Flags: ignoreversion; Components: libs Source: "libintl.dll"; DestDir: "{app}"; Flags: ignoreversion; Components: libs
Source: "libpng16.dll"; DestDir: "{app}"; Flags: ignoreversion; Components: libs Source: "libpng16.dll"; DestDir: "{app}"; Flags: ignoreversion; Components: libs
Source: "libxml2.dll"; DestDir: "{app}"; Flags: ignoreversion; Components: libs Source: "libxml2.dll"; DestDir: "{app}"; Flags: ignoreversion; Components: libs
@@ -155,6 +157,14 @@ Source: "lib\enchant\*"; DestDir: "{app}\lib\enchant"; Flags: ignoreversion; Com
Source: "lib\gtk-2.0\i686-pc-vs14\engines\*"; DestDir: "{app}\lib\gtk-2.0\i686-pc-vs14\engines"; Flags: ignoreversion; Components: libs Source: "lib\gtk-2.0\i686-pc-vs14\engines\*"; DestDir: "{app}\lib\gtk-2.0\i686-pc-vs14\engines"; Flags: ignoreversion; Components: libs
Source: "girepository-1.0.dll"; DestDir: "{app}"; Flags: ignoreversion; Components: langs\lua
Source: "lua51.dll"; DestDir: "{app}"; Flags: ignoreversion; Components: langs\lua
Source: "lib\lua\lgi\*.dll"; DestDir: "{app}\lib\lua\lgi"; Flags: ignoreversion; Components: langs\lua
Source: "lib\girepository-1.0\*.typelib"; DestDir: "{app}\lib\girepository-1.0"; Flags: ignoreversion; Components: langs\lua
Source: "share\lua\*.lua"; DestDir: "{app}\share\lua"; Flags: ignoreversion; Components: langs\lua
Source: "share\lua\lgi\*.lua"; DestDir: "{app}\share\lua\lgi"; Flags: ignoreversion; Components: langs\lua
Source: "share\lua\lgi\override\*.lua"; DestDir: "{app}\share\lua\lgi\override"; Flags: ignoreversion; Components: langs\lua
Source: "plugins\hcchecksum.dll"; DestDir: "{app}\plugins"; Flags: ignoreversion; Components: plugins\checksum Source: "plugins\hcchecksum.dll"; DestDir: "{app}\plugins"; Flags: ignoreversion; Components: plugins\checksum
Source: "plugins\hcdoat.dll"; DestDir: "{app}\plugins"; Flags: ignoreversion; Components: plugins\doat Source: "plugins\hcdoat.dll"; DestDir: "{app}\plugins"; Flags: ignoreversion; Components: plugins\doat
Source: "plugins\hcexec.dll"; DestDir: "{app}\plugins"; Flags: ignoreversion; Components: plugins\exec Source: "plugins\hcexec.dll"; DestDir: "{app}\plugins"; Flags: ignoreversion; Components: plugins\exec
@@ -171,6 +181,7 @@ Source: "plugins\hcsysinfo.dll"; DestDir: "{app}\plugins"; Flags: ignoreversion;
Source: "plugins\hcpython2.dll"; DestDir: "{app}\plugins"; Flags: ignoreversion; Components: langs\python\python2 Source: "plugins\hcpython2.dll"; DestDir: "{app}\plugins"; Flags: ignoreversion; Components: langs\python\python2
Source: "plugins\hcpython3.dll"; DestDir: "{app}\plugins"; Flags: ignoreversion; Components: langs\python\python3 Source: "plugins\hcpython3.dll"; DestDir: "{app}\plugins"; Flags: ignoreversion; Components: langs\python\python3
Source: "plugins\hcperl.dll"; DestDir: "{app}\plugins"; Flags: ignoreversion; Components: langs\perl Source: "plugins\hcperl.dll"; DestDir: "{app}\plugins"; Flags: ignoreversion; Components: langs\perl
Source: "plugins\hclua.dll"; DestDir: "{app}\plugins"; Flags: ignoreversion; Components: langs\lua
Source: "hexchat.exe"; DestDir: "{app}"; Flags: ignoreversion; Components: libs Source: "hexchat.exe"; DestDir: "{app}"; Flags: ignoreversion; Components: libs
Source: "hexchat-text.exe"; DestDir: "{app}"; Flags: ignoreversion; Components: xctext Source: "hexchat-text.exe"; DestDir: "{app}"; Flags: ignoreversion; Components: xctext
@@ -271,13 +282,13 @@ begin
#if APPARCH == "x64" #if APPARCH == "x64"
REDIST := 'https://dl.hexchat.net/misc/vcredist_2015_x64.exe'; REDIST := 'https://dl.hexchat.net/misc/vcredist_2015_x64.exe';
PERL := 'https://dl.hexchat.net/misc/perl/Perl%205.20.0%20x64.msi'; PERL := 'https://dl.hexchat.net/misc/perl/Perl%205.20.0%20x64.msi';
PY2 := 'http://python.org/ftp/python/2.7.10/python-2.7.10.amd64.msi'; PY2 := 'https://python.org/ftp/python/2.7.10/python-2.7.10.amd64.msi';
PY3 := 'http://python.org/ftp/python/3.5.1/python-3.5.1-amd64.exe'; PY3 := 'https://python.org/ftp/python/3.5.1/python-3.5.1-amd64.exe';
#else #else
REDIST := 'https://dl.hexchat.net/misc/vcredist_2015_x86.exe'; REDIST := 'https://dl.hexchat.net/misc/vcredist_2015_x86.exe';
PERL := 'https://dl.hexchat.net/misc/perl/Perl%205.20.0%20x86.msi'; PERL := 'https://dl.hexchat.net/misc/perl/Perl%205.20.0%20x86.msi';
PY2 := 'http://python.org/ftp/python/2.7.10/python-2.7.10.msi'; PY2 := 'https://python.org/ftp/python/2.7.10/python-2.7.10.msi';
PY3 := 'http://python.org/ftp/python/3.5.1/python-3.5.1.exe'; PY3 := 'https://python.org/ftp/python/3.5.1/python-3.5.1.exe';
#endif #endif
DOTNET := 'https://dl.hexchat.net/misc/dotnet_40.exe'; DOTNET := 'https://dl.hexchat.net/misc/dotnet_40.exe';
SPELL := 'https://dl.hexchat.net/hexchat/HexChat%20Spelling%20Dictionaries%20r2.exe'; SPELL := 'https://dl.hexchat.net/hexchat/HexChat%20Spelling%20Dictionaries%20r2.exe';

View File

@@ -1 +1 @@
2.12.0 2.12.1-2