mirror of
https://github.com/irssi/irssi.git
synced 2025-02-02 15:08:01 -05:00
Merge tag '1.3.2-an' into HEAD
This commit is contained in:
commit
2e6375d4ff
10
.github/workflows/check.yml
vendored
10
.github/workflows/check.yml
vendored
@ -18,7 +18,7 @@ jobs:
|
|||||||
steps:
|
steps:
|
||||||
- name: prepare required software
|
- name: prepare required software
|
||||||
run: |
|
run: |
|
||||||
sudo apt install $apt_build_deps $apt_build_deps_autotools
|
sudo apt update && sudo apt install $apt_build_deps $apt_build_deps_autotools
|
||||||
- uses: actions/checkout@main
|
- uses: actions/checkout@main
|
||||||
- name: make dist
|
- name: make dist
|
||||||
run: |
|
run: |
|
||||||
@ -38,18 +38,18 @@ jobs:
|
|||||||
strategy:
|
strategy:
|
||||||
fail-fast: false
|
fail-fast: false
|
||||||
matrix:
|
matrix:
|
||||||
os: [ubuntu-16.04, ubuntu-latest]
|
os: [ubuntu-18.04, ubuntu-latest]
|
||||||
builder: [meson, configure]
|
builder: [meson, configure]
|
||||||
compiler: [clang, gcc]
|
compiler: [clang, gcc]
|
||||||
flags: [regular]
|
flags: [regular]
|
||||||
include:
|
include:
|
||||||
- os: ubuntu-16.04
|
- os: ubuntu-18.04
|
||||||
builder: meson
|
builder: meson
|
||||||
meson_ver: ==0.49.2
|
meson_ver: ==0.49.2
|
||||||
setuptools_ver: <51
|
setuptools_ver: <51
|
||||||
- os: ubuntu-latest
|
- os: ubuntu-latest
|
||||||
builder: meson
|
builder: meson
|
||||||
meson_ver: <0.59.0
|
meson_ver: <0.60.0
|
||||||
- os: ubuntu-latest
|
- os: ubuntu-latest
|
||||||
builder: meson
|
builder: meson
|
||||||
flags: meson-latest FAILURE-OK
|
flags: meson-latest FAILURE-OK
|
||||||
@ -64,7 +64,7 @@ jobs:
|
|||||||
meson_ver: ${{ matrix.meson_ver }}
|
meson_ver: ${{ matrix.meson_ver }}
|
||||||
setuptools_ver: ${{ matrix.setuptools_ver }}
|
setuptools_ver: ${{ matrix.setuptools_ver }}
|
||||||
run: |
|
run: |
|
||||||
sudo apt install $apt_build_deps $apt_build_deps_${{ matrix.builder }}
|
sudo apt update && sudo apt install $apt_build_deps $apt_build_deps_${{ matrix.builder }}
|
||||||
eval "$get_pip_build_deps_${{ matrix.builder }}"
|
eval "$get_pip_build_deps_${{ matrix.builder }}"
|
||||||
curl -SLf https://github.com/irssi-import/actions-irssi/raw/master/check-irssi/render.pl -o ~/render.pl && chmod +x ~/render.pl
|
curl -SLf https://github.com/irssi-import/actions-irssi/raw/master/check-irssi/render.pl -o ~/render.pl && chmod +x ~/render.pl
|
||||||
- name: unpack archive
|
- name: unpack archive
|
||||||
|
50
NEWS
50
NEWS
@ -1,10 +1,23 @@
|
|||||||
v1.3.0-an 2021-09-05 Ailin Nemui <Nei>
|
v1.3.2-an 2022-01-14 Ailin Nemui <Nei>
|
||||||
* /SET resolve_reverse_lookup setting was removed (#1135)
|
- CHANTYPES take precedence over (missing) STATUSMSG in /join
|
||||||
|
(#1358, an#54)
|
||||||
|
- Fix crash in Perl's $view->set_bookmark (freebsd#254237,
|
||||||
|
an#56)
|
||||||
|
|
||||||
|
v1.3.1-an 2021-12-17 Ailin Nemui <Nei>
|
||||||
|
- Minor help fixes (an#51, an#52)
|
||||||
|
- Fix regression where own channel status was forgotten after
|
||||||
|
/UPGRADE (#1357, an#53)
|
||||||
|
|
||||||
|
v1.3.0-an 2021-11-11 Ailin Nemui <Nei>
|
||||||
|
* /SET resolve_reverse_lookup setting was removed (#1034,
|
||||||
|
#1135)
|
||||||
* Irssi will try to connect on IPv4 if IPv6 connection failed
|
* Irssi will try to connect on IPv4 if IPv6 connection failed
|
||||||
(#1146). By Shivaram Lingamneni
|
(#1146). By Shivaram Lingamneni
|
||||||
|
|
||||||
* The display system now renders formats on the fly (#1079,
|
* The display system now renders formats on the fly (#1079,
|
||||||
#1188, #1191, #1192, #1204, #1205, #1209, an#13, an#14, an#28,
|
#1188, #1191, #1192, #1204, #1205, #1209, #1349, #1355,
|
||||||
an#29)
|
an#13, an#14, an#28, an#29, an#36, an#37, an#49)
|
||||||
|
|
||||||
This major change will break scripts that try to modify
|
This major change will break scripts that try to modify
|
||||||
printed text during "print text" signal (#1189). They need
|
printed text during "print text" signal (#1189). They need
|
||||||
@ -38,7 +51,7 @@ v1.3.0-an 2021-09-05 Ailin Nemui <Nei>
|
|||||||
/SET show_names_on_join_limit -1
|
/SET show_names_on_join_limit -1
|
||||||
|
|
||||||
* -tls_verify is now enabled by default (#1170, an#18, #1309,
|
* -tls_verify is now enabled by default (#1170, an#18, #1309,
|
||||||
an#23)
|
an#23, #1343, #1351)
|
||||||
|
|
||||||
This may cause an ugly display of notls_verify in the output
|
This may cause an ugly display of notls_verify in the output
|
||||||
of /SERVER LIST, even on plain-text connection, on old
|
of /SERVER LIST, even on plain-text connection, on old
|
||||||
@ -127,21 +140,24 @@ v1.3.0-an 2021-09-05 Ailin Nemui <Nei>
|
|||||||
join_extended_account, that theme writers need to take into
|
join_extended_account, that theme writers need to take into
|
||||||
account if desired.
|
account if desired.
|
||||||
|
|
||||||
+ Add support for IRCv3 setname (#1093, #1104, #1254, GL#33,
|
+ Add support for IRCv3 setname (#1093, #1104, #1254, GL#33)
|
||||||
#1104, #1254)
|
|
||||||
+ Add support for IRCv3 account-notify (#1100, #1098, GL#33,
|
+ Add support for IRCv3 account-notify (#1100, #1098, GL#33,
|
||||||
#1105, #1131). Credit to oss-fuzz
|
#1105, #1131). Credit to oss-fuzz
|
||||||
/SET show_account_notify to enable
|
/SET show_account_notify to enable
|
||||||
+ Add support for IRCv3 invite-notify (#1094)
|
+ Add support for IRCv3 invite-notify (#1094)
|
||||||
+ Add support for receiving IRCv3 message-tags (#576, #1090)
|
+ Add support for receiving IRCv3 message-tags (#576, #1090)
|
||||||
+ Add support for sending IRCv3 message-tags (#1092)
|
+ Add support for sending IRCv3 message-tags (#1092, an#34)
|
||||||
+ Add support for the oragono.io/maxline-2 CAP to increase IRC
|
|
||||||
protocol line length (#1092)
|
|
||||||
+ Enable the znc.in/self-message CAP by default (#1123)
|
+ Enable the znc.in/self-message CAP by default (#1123)
|
||||||
+ Add support for IRCv3 away-notify. /SET away_notify_public
|
+ Add support for IRCv3 away-notify. /SET away_notify_public
|
||||||
to enable (#1099, GL#33, #1105)
|
to enable (#1099, GL#33, #1105)
|
||||||
+ Add support for IRCv3 chghost (#1096, GL#33, #1105)
|
+ Add support for IRCv3 chghost (#1096, GL#33, #1105)
|
||||||
+ Add support for IRCv3 account-notify.
|
|
||||||
|
For servers with broken chghost implementation that fill the
|
||||||
|
status window with host changed messages, one may add "quote
|
||||||
|
cap req -chghost" to the -autosendcmd or, if the host change
|
||||||
|
messages are entirely undesired, "/format -delete
|
||||||
|
host_changed"
|
||||||
|
|
||||||
+ Add support for IRCv3 server-time. /SET show_server_time to
|
+ Add support for IRCv3 server-time. /SET show_server_time to
|
||||||
enable (#1108)
|
enable (#1108)
|
||||||
+ Add support for logging IRCv3 server-time.
|
+ Add support for logging IRCv3 server-time.
|
||||||
@ -183,7 +199,7 @@ v1.3.0-an 2021-09-05 Ailin Nemui <Nei>
|
|||||||
+ Allow -tls_ca{file,path} '' to unset an argument (#730,
|
+ Allow -tls_ca{file,path} '' to unset an argument (#730,
|
||||||
#1060, an#30)
|
#1060, an#30)
|
||||||
+ Add a "server outgoing modify" signal to intercept outgoing
|
+ Add a "server outgoing modify" signal to intercept outgoing
|
||||||
messages (#1148, #1151, an#15). Original by
|
messages (#1148, #1151, an#15, an#43). Original by
|
||||||
JustAnotherArchivist
|
JustAnotherArchivist
|
||||||
- remove some hard-coded 510 byte assumptions (#1086)
|
- remove some hard-coded 510 byte assumptions (#1086)
|
||||||
- Several fixes for error checks in SSL (#944, #1037, #943,
|
- Several fixes for error checks in SSL (#944, #1037, #943,
|
||||||
@ -207,7 +223,7 @@ v1.3.0-an 2021-09-05 Ailin Nemui <Nei>
|
|||||||
#891, #1129). By Dan Collins
|
#891, #1129). By Dan Collins
|
||||||
- Fix /IGNORE not setting the right level in irc_op_public
|
- Fix /IGNORE not setting the right level in irc_op_public
|
||||||
messages (#1280). Credit to oss-fuzz
|
messages (#1280). Credit to oss-fuzz
|
||||||
- Fix GTimeVal deprecation (#1141, #1144, #1145)
|
- Fix GTimeVal deprecation (#1141, #1144, #1145, #1350, an#44)
|
||||||
|
|
||||||
If multi-version compatibility is desired, module authors
|
If multi-version compatibility is desired, module authors
|
||||||
can find an example of backwards compatible code in
|
can find an example of backwards compatible code in
|
||||||
@ -241,12 +257,13 @@ v1.3.0-an 2021-09-05 Ailin Nemui <Nei>
|
|||||||
- Fix /SERVER ADD -matrix -network my_matrix_network
|
- Fix /SERVER ADD -matrix -network my_matrix_network
|
||||||
(an#12). By Andrej Kacian
|
(an#12). By Andrej Kacian
|
||||||
- Fix /SERVER ADD creating duplicated entries in the config
|
- Fix /SERVER ADD creating duplicated entries in the config
|
||||||
file (#1317, an#22)
|
file (#1317, an#22, an#41)
|
||||||
- Fix critical when SASL user is set and SASL password is
|
- Fix critical when SASL user is set and SASL password is
|
||||||
empty (#1325, an#21)
|
empty (#1325, an#21)
|
||||||
- Misc fixes (#1106, #1141, #1272, #1297)
|
- Misc fixes (#1106, #1141, #1272, #1297, an#35)
|
||||||
- Fuzz fixes (#1116, #1117, #1119, #1125, #1126, an#20)
|
- Fuzz fixes (#1116, #1117, #1119, #1125, #1126, an#20)
|
||||||
- Build system fixes (#1101, #1102, #1069, #1140, #1181, #1253)
|
- Build system fixes (#1101, #1102, #1069, #1140, #1181, #1253)
|
||||||
|
- Sync docs and scripts (an#39)
|
||||||
- Text and Help updates
|
- Text and Help updates
|
||||||
- add -tls_* options to manual (#1029, #1030). By Jacob
|
- add -tls_* options to manual (#1029, #1030). By Jacob
|
||||||
V. Rasmussen
|
V. Rasmussen
|
||||||
@ -262,9 +279,10 @@ v1.3.0-an 2021-09-05 Ailin Nemui <Nei>
|
|||||||
- Add documentation for escaping some characters (#1329,
|
- Add documentation for escaping some characters (#1329,
|
||||||
#1330, an#9). By Guntbert Reiter
|
#1330, an#9). By Guntbert Reiter
|
||||||
- Fix some typos (#1336, an#10). By Francis Mteo
|
- Fix some typos (#1336, an#10). By Francis Mteo
|
||||||
|
- Document $abiversion and parse_special (an#38). By bw1
|
||||||
- Infrastructure updates:
|
- Infrastructure updates:
|
||||||
- Support for Github Actions (#1039, #1103, #1160, #1212,
|
- Support for Github Actions (#1039, #1103, #1160, #1212,
|
||||||
#1231, #1252, #1261)
|
#1231, #1252, #1261, an#40)
|
||||||
- Run clang-format on pull requests (#1172, #1173, #1184,
|
- Run clang-format on pull requests (#1172, #1173, #1184,
|
||||||
#1230, #1247, #1287)
|
#1230, #1247, #1287)
|
||||||
- Run abidiff on pull requests (#1179, #1195)
|
- Run abidiff on pull requests (#1179, #1195)
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
AC_INIT(irssi, 1.3-head)
|
AC_INIT(irssi, 1.3.2-an)
|
||||||
AC_CONFIG_SRCDIR([src])
|
AC_CONFIG_SRCDIR([src])
|
||||||
AC_CONFIG_AUX_DIR(build-aux)
|
AC_CONFIG_AUX_DIR(build-aux)
|
||||||
AC_PREREQ(2.50)
|
AC_PREREQ(2.50)
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
<h1>Frequently Asked Questions</h1>
|
<h1>Frequently Asked Questions</h1>
|
||||||
<h3 id="q-why-doesnt-irssi-display-colors-even-when-ircii-etc-displays-them">Q: Why doesn’t irssi display colors even when ircii etc. displays them?</h3>
|
<h3 id="q-why-doesnt-irssi-display-colors-even-when-ircii-etc-displays-them">Q: Why doesn’t irssi display colors even when ircii etc. displays them?</h3>
|
||||||
|
|
||||||
<p>A: They force ANSI colors even if terminal doesn’t support them. By default, irssi uses colors only if terminfo/termcap so says. The correct way to fix this would be to change your TERM environment to a value where colors work, like xterm-color or color_xterm (eg. <code>TERM=xterm-color irssi</code>). If this doesn’t help, then use the evil way of <code>/SET term_force_colors ON</code>.</p>
|
<p>A: They force ANSI colors even if terminal doesn’t support them. By default, irssi uses colors only if terminfo/termcap so says. The correct way to fix this would be to change your TERM environment to a value where colors work, like xterm-256color or color_xterm (eg. <code>TERM=xterm-256color irssi</code>). If this doesn’t help, then use the evil way of <code>/SET term_force_colors ON</code>.</p>
|
||||||
|
|
||||||
<h3 id="q-how-do-i-easily-write-text-to-channel-that-starts-with--character">Q: How do I easily write text to channel that starts with ‘/’ character?</h3>
|
<h3 id="q-how-do-i-easily-write-text-to-channel-that-starts-with--character">Q: How do I easily write text to channel that starts with ‘/’ character?</h3>
|
||||||
|
|
||||||
@ -54,7 +54,7 @@
|
|||||||
|
|
||||||
<h3 id="q-will-there-be-detach-like-feature">Q: Will there be /DETACH-like feature?</h3>
|
<h3 id="q-will-there-be-detach-like-feature">Q: Will there be /DETACH-like feature?</h3>
|
||||||
|
|
||||||
<p>A: <a href="https://tmux.github.io/">tmux</a>, <a href="https://www.gnu.org/software/screen/screen.html">screen</a> and <a href="http://dtach.sf.net/">dtach</a> can be used to do it just fine.</p>
|
<p>A: <a href="https://tmux.github.io/">tmux</a>, <a href="https://www.gnu.org/software/screen/screen.html">screen</a> and <a href="https://sourceforge.net/projects/dtach/">dtach</a> can be used to do it just fine.</p>
|
||||||
|
|
||||||
<h3 id="q-how-do-i-run-scripts-automatically-at-startup">Q: How do I run scripts automatically at startup?</h3>
|
<h3 id="q-how-do-i-run-scripts-automatically-at-startup">Q: How do I run scripts automatically at startup?</h3>
|
||||||
|
|
||||||
|
@ -4,8 +4,8 @@ Q: Why doesn’t irssi display colors even when ircii etc. displays them?
|
|||||||
A: They force ANSI colors even if terminal doesn’t support them. By default,
|
A: They force ANSI colors even if terminal doesn’t support them. By default,
|
||||||
irssi uses colors only if terminfo/termcap so says. The correct way to fix this
|
irssi uses colors only if terminfo/termcap so says. The correct way to fix this
|
||||||
would be to change your TERM environment to a value where colors work, like
|
would be to change your TERM environment to a value where colors work, like
|
||||||
xterm-color or color_xterm (eg. TERM=xterm-color irssi). If this doesn’t help,
|
xterm-256color or color_xterm (eg. TERM=xterm-256color irssi). If this doesn’t
|
||||||
then use the evil way of /SET term_force_colors ON.
|
help, then use the evil way of /SET term_force_colors ON.
|
||||||
|
|
||||||
Q: How do I easily write text to channel that starts with ‘/’ character?
|
Q: How do I easily write text to channel that starts with ‘/’ character?
|
||||||
A: / /text
|
A: / /text
|
||||||
@ -119,6 +119,6 @@ A: Check [6]here
|
|||||||
[1] https://github.com/irssi-import/xirssi
|
[1] https://github.com/irssi-import/xirssi
|
||||||
[2] https://tmux.github.io/
|
[2] https://tmux.github.io/
|
||||||
[3] https://www.gnu.org/software/screen/screen.html
|
[3] https://www.gnu.org/software/screen/screen.html
|
||||||
[4] http://dtach.sf.net/
|
[4] https://sourceforge.net/projects/dtach/
|
||||||
[5] https://dgl.cx/irssi/hack-whois-in-current-window.pl
|
[5] https://dgl.cx/irssi/hack-whois-in-current-window.pl
|
||||||
[6] https://irssi.org/assets/irssi.wav
|
[6] https://irssi.org/assets/irssi.wav
|
||||||
|
@ -5,7 +5,7 @@
|
|||||||
|
|
||||||
%9Parameters:%9
|
%9Parameters:%9
|
||||||
|
|
||||||
LIST: Displays the list of servers you are connected to.
|
LIST: Displays the list of servers you have configured.
|
||||||
CONNECT: Connects to the given server.
|
CONNECT: Connects to the given server.
|
||||||
ADD: Adds a server to your configuration.
|
ADD: Adds a server to your configuration.
|
||||||
MODIFY: Modifies a server in your configuration.
|
MODIFY: Modifies a server in your configuration.
|
||||||
@ -51,10 +51,9 @@
|
|||||||
When using the ADD parameter on a server that already exists, the
|
When using the ADD parameter on a server that already exists, the
|
||||||
configuration will be merged with each other.
|
configuration will be merged with each other.
|
||||||
|
|
||||||
When using the command without any of the given parameters, it will
|
When using the CONNECT parameter, it will connect to the specified
|
||||||
connect to the specified server; the server in the active window will be
|
server; the server in the active window will be disconnected
|
||||||
disconnected unless you prepend the server with the '+' character; the same
|
unless you prepend the server with the '+' character.
|
||||||
method is applicable to the CONNECT parameter.
|
|
||||||
|
|
||||||
Specify '-' as password to remove a server password
|
Specify '-' as password to remove a server password
|
||||||
|
|
||||||
|
@ -151,7 +151,7 @@ irc.c:
|
|||||||
"whois default event", SERVER_REC, char *args, char *sender_nick, char *sender_address
|
"whois default event", SERVER_REC, char *args, char *sender_nick, char *sender_address
|
||||||
|
|
||||||
"server incoming", SERVER_REC, char *data
|
"server incoming", SERVER_REC, char *data
|
||||||
"server outgoing modify", SERVER_REC, GString *data
|
"server outgoing modify", SERVER_REC, GString *data, int crlf
|
||||||
|
|
||||||
(for perl parser..)
|
(for perl parser..)
|
||||||
"redir "<cmd>, SERVER_REC, char *args, char *sender_nick, char *sender_address
|
"redir "<cmd>, SERVER_REC, char *args, char *sender_nick, char *sender_address
|
||||||
|
@ -226,7 +226,7 @@ Ctrl-P, Ctrl-N - Jump to previous / next window
|
|||||||
|
|
||||||
<p>And finally channels:</p>
|
<p>And finally channels:</p>
|
||||||
|
|
||||||
<div><div><pre><code>/CHANNEL ADD -auto -bots *!*user@host -botcmd "/^msg $0 op pass" #irssi efnet
|
<div><div><pre><code>/CHANNEL ADD -auto -bots *!*bot@host.org -botcmd "/^msg $0 op pass" #irssi efnet
|
||||||
/CHANNEL ADD -auto #secret IRCnet password
|
/CHANNEL ADD -auto #secret IRCnet password
|
||||||
</code></pre></div></div>
|
</code></pre></div></div>
|
||||||
|
|
||||||
@ -395,7 +395,7 @@ Ctrl-X - set the next server in list active
|
|||||||
|
|
||||||
<p><code>/HELP bind</code> tells pretty much everything there is to know about keyboard bindings. However, there’s the problem of how to bind some non-standard keys. They might differ a bit with each terminal, so you’ll need to find out what exactly the keypress produces. Easiest way to check that would be to see what it prints in <code>cat</code>. Here’s an example for pressing F1 key:</p>
|
<p><code>/HELP bind</code> tells pretty much everything there is to know about keyboard bindings. However, there’s the problem of how to bind some non-standard keys. They might differ a bit with each terminal, so you’ll need to find out what exactly the keypress produces. Easiest way to check that would be to see what it prints in <code>cat</code>. Here’s an example for pressing F1 key:</p>
|
||||||
|
|
||||||
<div><div><pre><code> [user@host] ~% cat
|
<div><div><pre><code> [cras@hurina] ~% cat
|
||||||
^[OP
|
^[OP
|
||||||
</code></pre></div></div>
|
</code></pre></div></div>
|
||||||
|
|
||||||
|
@ -218,7 +218,7 @@ IRC network, other servers are automatically connected in same network if the
|
|||||||
|
|
||||||
And finally channels:
|
And finally channels:
|
||||||
|
|
||||||
/CHANNEL ADD -auto -bots *!*user@host -botcmd "/^msg $0 op pass" #irssi efnet
|
/CHANNEL ADD -auto -bots *!*bot@host.org -botcmd "/^msg $0 op pass" #irssi efnet
|
||||||
/CHANNEL ADD -auto #secret IRCnet password
|
/CHANNEL ADD -auto #secret IRCnet password
|
||||||
|
|
||||||
-bots and -botcmd should be the only ones needing a bit of explaining. They’re
|
-bots and -botcmd should be the only ones needing a bit of explaining. They’re
|
||||||
@ -442,7 +442,7 @@ They might differ a bit with each terminal, so you’ll need to find out what
|
|||||||
exactly the keypress produces. Easiest way to check that would be to see what
|
exactly the keypress produces. Easiest way to check that would be to see what
|
||||||
it prints in cat. Here’s an example for pressing F1 key:
|
it prints in cat. Here’s an example for pressing F1 key:
|
||||||
|
|
||||||
[user@host] ~% cat
|
[cras@hurina] ~% cat
|
||||||
^[OP
|
^[OP
|
||||||
|
|
||||||
So in irssi you would use /BIND ^[OP /ECHO F1 pressed. If you use multiple
|
So in irssi you would use /BIND ^[OP /ECHO F1 pressed. If you use multiple
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
project('irssi', 'c',
|
project('irssi', 'c',
|
||||||
version : '1.3-head',
|
version : '1.3.2-an',
|
||||||
meson_version : '>=0.49',
|
meson_version : '>=0.49',
|
||||||
default_options : ['warning_level=1'])
|
default_options : ['warning_level=1'])
|
||||||
|
|
||||||
|
@ -6,36 +6,27 @@ use Irssi::Irc;
|
|||||||
use strict;
|
use strict;
|
||||||
use vars qw($VERSION %IRSSI);
|
use vars qw($VERSION %IRSSI);
|
||||||
|
|
||||||
$VERSION = "1.00";
|
$VERSION = "1.01";
|
||||||
%IRSSI = (
|
%IRSSI = (
|
||||||
authors => 'Timo Sirainen',
|
authors => 'Timo Sirainen',
|
||||||
name => 'quitmsg',
|
name => 'quitmsg',
|
||||||
description => 'Random quit messages',
|
description => 'Random quit messages',
|
||||||
license => 'Public Domain',
|
license => 'Public Domain',
|
||||||
changed => 'Sun Mar 10 23:18 EET 2002'
|
changed => 'Mon Jul 22 20:00 EET 2020'
|
||||||
);
|
);
|
||||||
|
|
||||||
my $quitfile = glob "~/.irssi/irssi.quit";
|
my $quitfile = Irssi::get_irssi_dir() . "/irssi.quit";
|
||||||
|
|
||||||
sub cmd_quit {
|
sub cmd_quit {
|
||||||
my ($data, $server, $channel) = @_;
|
my ($data, $server, $channel) = @_;
|
||||||
return if ($data ne "");
|
return if ($data ne "");
|
||||||
|
|
||||||
|
open (my $fh, "<", $quitfile) || return;
|
||||||
|
my @lines = <$fh>;
|
||||||
|
|
||||||
open (f, "<", $quitfile) || return;
|
my $quitmsg = $lines[int(rand(@lines))];
|
||||||
my $lines = 0; while(<f>) { $lines++; };
|
chomp($quitmsg);
|
||||||
|
close($fh);
|
||||||
my $line = int(rand($lines))+1;
|
|
||||||
|
|
||||||
my $quitmsg;
|
|
||||||
seek(f, 0, 0); $. = 0;
|
|
||||||
while(<f>) {
|
|
||||||
next if ($. != $line);
|
|
||||||
|
|
||||||
chomp;
|
|
||||||
$quitmsg = $_;
|
|
||||||
last;
|
|
||||||
}
|
|
||||||
close(f);
|
|
||||||
|
|
||||||
foreach my $server (Irssi::servers) {
|
foreach my $server (Irssi::servers) {
|
||||||
$server->command("/disconnect ".$server->{tag}." $quitmsg");
|
$server->command("/disconnect ".$server->{tag}." $quitmsg");
|
||||||
|
@ -5,7 +5,7 @@
|
|||||||
|
|
||||||
use strict;
|
use strict;
|
||||||
|
|
||||||
our $VERSION = '2003020807';
|
our $VERSION = '2020042700';
|
||||||
our %IRSSI = (
|
our %IRSSI = (
|
||||||
authors => 'Stefan \'tommie\' Tomanek',
|
authors => 'Stefan \'tommie\' Tomanek',
|
||||||
contact => 'stefan@pico.ruhr.de',
|
contact => 'stefan@pico.ruhr.de',
|
||||||
@ -23,12 +23,15 @@ use Irssi 20020324;
|
|||||||
use CPAN::Meta::YAML;
|
use CPAN::Meta::YAML;
|
||||||
use LWP::UserAgent;
|
use LWP::UserAgent;
|
||||||
use POSIX;
|
use POSIX;
|
||||||
|
use version;
|
||||||
|
|
||||||
# GnuPG is not always needed
|
# GnuPG is not always needed
|
||||||
$have_gpg = 0;
|
$have_gpg = 0;
|
||||||
eval "use GnuPG qw(:algo :trust);";
|
eval "use GnuPG qw(:algo :trust);";
|
||||||
$have_gpg = 1 if not ($@);
|
$have_gpg = 1 if not ($@);
|
||||||
|
|
||||||
|
my $irssi_version = qv(Irssi::parse_special('v$J') =~ s/-.*//r);
|
||||||
|
|
||||||
sub show_help {
|
sub show_help {
|
||||||
my $help = "scriptassist $VERSION
|
my $help = "scriptassist $VERSION
|
||||||
/scriptassist check
|
/scriptassist check
|
||||||
@ -39,15 +42,15 @@ sub show_help {
|
|||||||
Search the script database
|
Search the script database
|
||||||
/scriptassist info <scripts>
|
/scriptassist info <scripts>
|
||||||
Display information about <scripts>
|
Display information about <scripts>
|
||||||
".#/scriptassist ratings <scripts>
|
/scriptassist ratings <scripts|all>
|
||||||
# Retrieve the average ratings of the the scripts
|
Retrieve the average ratings of the the scripts
|
||||||
#/scriptassist top <num>
|
/scriptassist top <num>
|
||||||
# Retrieve the first <num> top rated scripts
|
Retrieve the first <num> top rated scripts
|
||||||
"/scriptassist new <num>
|
/scriptassist new <num>
|
||||||
Display the newest <num> scripts
|
Display the newest <num> scripts
|
||||||
".#/scriptassist rate <script> <stars>
|
/scriptassist rate <script>
|
||||||
# Rate the script with a number of stars ranging from 0-5
|
Rate the script if you like it
|
||||||
"/scriptassist contact <script>
|
/scriptassist contact <script>
|
||||||
Write an email to the author of the script
|
Write an email to the author of the script
|
||||||
(Requires OpenURL)
|
(Requires OpenURL)
|
||||||
/scriptassist cpan <module>
|
/scriptassist cpan <module>
|
||||||
@ -95,6 +98,7 @@ sub call_openurl {
|
|||||||
$code->($url);
|
$code->($url);
|
||||||
} else {
|
} else {
|
||||||
print CLIENTCRAP "%R>>%n Please install openurl.pl";
|
print CLIENTCRAP "%R>>%n Please install openurl.pl";
|
||||||
|
print CLIENTCRAP "%R>>%n or open < $url > manually";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -188,7 +192,7 @@ sub get_unknown {
|
|||||||
foreach (keys %$db) {
|
foreach (keys %$db) {
|
||||||
next unless defined $db->{$_}{commands};
|
next unless defined $db->{$_}{commands};
|
||||||
foreach my $item (split / /, $db->{$_}{commands}) {
|
foreach my $item (split / /, $db->{$_}{commands}) {
|
||||||
return { $_ => $db->{$_} } if ($item =~ /^$cmd$/i);
|
return { $_ => +{%{$db->{$_}}} } if ($item =~ /^$cmd$/i);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return undef;
|
return undef;
|
||||||
@ -264,47 +268,80 @@ sub script_info {
|
|||||||
$result{$sname}{modules}{$mod}{installed} = module_exist($mod);
|
$result{$sname}{modules}{$mod}{installed} = module_exist($mod);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (defined $xml->{$plname}{depends}) {
|
# if (defined $xml->{$plname}{depends}) {
|
||||||
my $depends = $xml->{$plname}{depends};
|
# my $depends = $xml->{$plname}{depends};
|
||||||
foreach my $dep (split(/ /, $depends)) {
|
# foreach my $dep (split(/ /, $depends)) {
|
||||||
$result{$sname}{depends}{$dep}{installed} = 1;
|
# $result{$sname}{depends}{$dep}{installed} = 1; #(defined ${ 'Irssi::Script::'.$dep });
|
||||||
}
|
# }
|
||||||
}
|
# }
|
||||||
}
|
}
|
||||||
return \%result;
|
return \%result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
sub get_rate_url {
|
||||||
|
my ($src) = @_;
|
||||||
|
my $ua = LWP::UserAgent->new(env_proxy=>1, keep_alive=>1, timeout=>30);
|
||||||
|
$ua->agent('ScriptAssist/'.$VERSION);
|
||||||
|
my $request = HTTP::Request->new('GET', $src);
|
||||||
|
my $response = $ua->request($request);
|
||||||
|
unless ($response->is_success) {
|
||||||
|
my $error = join "\n", $response->status_line(), (grep / at .* line \d+/, split "\n", $response->content()), '';
|
||||||
|
die("Fetching ratings location failed: $error");
|
||||||
|
}
|
||||||
|
my $votes_url;
|
||||||
|
for my $tag ($response->content() =~ /<script([^>]*)>/g) {
|
||||||
|
my $attr = " $tag ";
|
||||||
|
($votes_url = $1) =~ s/\.\w+$/.yml/
|
||||||
|
if $attr =~ /\sasync\s/ && $attr =~ m{\ssrc="(https?://.*?/votes\.\w+)"\s};
|
||||||
|
}
|
||||||
|
unless ($votes_url) {
|
||||||
|
die("Fetching ratings failed: Could not find votes script\n");
|
||||||
|
}
|
||||||
|
$request = HTTP::Request->new('GET', $votes_url);
|
||||||
|
$response = $ua->request($request);
|
||||||
|
if (!$response->is_success) {
|
||||||
|
my $error = join "\n", $response->status_line(), (grep / at .* line \d+/, split "\n", $response->content()), '';
|
||||||
|
die("Fetching ratings failed: $error");
|
||||||
|
}
|
||||||
|
my $data = $response->content();
|
||||||
|
utf8::decode($data);
|
||||||
|
CPAN::Meta::YAML->read_string($data)->[0];
|
||||||
|
}
|
||||||
|
|
||||||
sub rate_script {
|
sub rate_script {
|
||||||
my ($script, $stars) = @_;
|
my ($script, $stars) = @_;
|
||||||
my $ua = LWP::UserAgent->new(env_proxy=>1, keep_alive=>1, timeout=>30);
|
my $xml = get_scripts();
|
||||||
$ua->agent('ScriptAssist/'.2003020803);
|
my $votes = get_rate_url(map { $_->{source} } values %$xml);
|
||||||
my $request = HTTP::Request->new('GET', 'http://ratings.irssi.de/irssirate.pl?&stars='.$stars.'&mode=rate&script='.$script);
|
my ($sname, $plname, $pname) = get_names($script, $xml);
|
||||||
my $response = $ua->request($request);
|
die "Script $script not found\n" unless $votes->{$plname};
|
||||||
unless ($response->is_success() && $response->content() =~ /You already rated this script/) {
|
return $votes->{$plname}{u}
|
||||||
return 1;
|
|
||||||
} else {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
sub get_ratings {
|
sub get_ratings {
|
||||||
my ($scripts, $limit) = @_;
|
my ($scripts, $limit) = @_;
|
||||||
my $ua = LWP::UserAgent->new(env_proxy=>1, keep_alive=>1, timeout=>30);
|
my $xml = get_scripts();
|
||||||
$ua->agent('ScriptAssist/'.2003020803);
|
my $votes = get_rate_url(map { $_->{source} } values %$xml);
|
||||||
my $script = join(',', @{$scripts});
|
foreach (keys %{$votes}) {
|
||||||
my $request = HTTP::Request->new('GET', 'http://ratings.irssi.de/irssirate.pl?script='.$script.'&sort=rating&limit='.$limit);
|
if ($xml->{$_}) {
|
||||||
my $response = $ua->request($request);
|
$xml->{$_}{votes} = $votes->{$_}{v};
|
||||||
my %result;
|
|
||||||
if ($response->is_success()) {
|
|
||||||
foreach (split /\n/, $response->content()) {
|
|
||||||
if (/<tr><td><a href=".*?">(.*?)<\/a>/) {
|
|
||||||
my $entry = $1;
|
|
||||||
if (/"><\/td><td>([0-9.]+)<\/td><td>(.*?)<\/td><td>/) {
|
|
||||||
$result{$entry} = [$1, $2];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
my %result;
|
||||||
|
if (@{$scripts}) {
|
||||||
|
foreach (@{$scripts}) {
|
||||||
|
my ($sname, $plname, $pname) = get_names($_, $xml);
|
||||||
|
next unless (defined $xml->{$plname} || ( exists $Irssi::Script::{$pname} && exists $Irssi::Script::{$pname}{IRSSI} ));
|
||||||
|
$result{$plname} = [$xml->{$plname}{votes}];
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
my @keys = sort { $xml->{$b}{votes} <=> $xml->{$a}{votes}
|
||||||
|
|| $xml->{$b}{modified} cmp $xml->{$a}{modified} }
|
||||||
|
grep { !$xml->{$_}{HIDDEN} && $xml->{$_}{votes} ne '' } keys %$xml;
|
||||||
|
foreach (splice @keys, 0, $limit) {
|
||||||
|
$result{$_} = [$xml->{$_}{votes}];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
die "No such script found\n" unless keys %result;
|
||||||
return \%result;
|
return \%result;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -597,13 +634,8 @@ sub print_rate {
|
|||||||
my (%data) = @_;
|
my (%data) = @_;
|
||||||
my $line;
|
my $line;
|
||||||
foreach my $script (sort keys(%data)) {
|
foreach my $script (sort keys(%data)) {
|
||||||
if ($data{$script}) {
|
call_openurl($data{$script});
|
||||||
$line .= "%go%n %9".$script."%9 has been rated";
|
|
||||||
} else {
|
|
||||||
$line .= "%ro%n %9".$script."%9 : Already rated this script";
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
print CLIENTCRAP draw_box('ScriptAssist', $line, 'rating', 1) ;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
sub print_ratings {
|
sub print_ratings {
|
||||||
@ -617,8 +649,7 @@ sub print_ratings {
|
|||||||
push @line, "%yo%n";
|
push @line, "%yo%n";
|
||||||
}
|
}
|
||||||
push @line, "%9".$script."%9";
|
push @line, "%9".$script."%9";
|
||||||
push @line, $data{$script}{rating};
|
push @line, "[".(length $data{$script}{rating} ? $data{$script}{rating} : 'no')." votes]";
|
||||||
push @line, "[".$data{$script}{votes}." votes]";
|
|
||||||
push @table, \@line;
|
push @table, \@line;
|
||||||
}
|
}
|
||||||
print CLIENTCRAP draw_box('ScriptAssist', array2table(@table), 'ratings', 1) ;
|
print CLIENTCRAP draw_box('ScriptAssist', array2table(@table), 'ratings', 1) ;
|
||||||
@ -845,7 +876,8 @@ sub get_scripts {
|
|||||||
}
|
}
|
||||||
$fetched = 1;
|
$fetched = 1;
|
||||||
my $data = $response->content();
|
my $data = $response->content();
|
||||||
my ($src, $type);
|
my $src = $site;
|
||||||
|
my $type = '';
|
||||||
if ($site =~ /(.*\/).+\.(.+)/) {
|
if ($site =~ /(.*\/).+\.(.+)/) {
|
||||||
$src = $1;
|
$src = $1;
|
||||||
$type = $2;
|
$type = $2;
|
||||||
@ -1115,9 +1147,9 @@ sub cmd_scripassist {
|
|||||||
} elsif ($args[0] eq 'ratings' && defined $args[1]) {
|
} elsif ($args[0] eq 'ratings' && defined $args[1]) {
|
||||||
shift @args;
|
shift @args;
|
||||||
bg_do("ratings ".join(' ', @args));
|
bg_do("ratings ".join(' ', @args));
|
||||||
} elsif ($args[0] eq 'rate' && defined $args[1] && defined $args[2]) {
|
} elsif ($args[0] eq 'rate' && defined $args[1]) {
|
||||||
shift @args;
|
shift @args;
|
||||||
bg_do("rate ".join(' ', @args)) if ($args[2] >= 0 && $args[2] < 6);
|
bg_do("rate ".join(' ', @args));
|
||||||
} elsif ($args[0] eq 'info' && defined $args[1]) {
|
} elsif ($args[0] eq 'info' && defined $args[1]) {
|
||||||
shift @args;
|
shift @args;
|
||||||
bg_do("info ".join(' ', @args));
|
bg_do("info ".join(' ', @args));
|
||||||
@ -1158,6 +1190,7 @@ sub sig_command_script_load {
|
|||||||
sub sig_default_command {
|
sub sig_default_command {
|
||||||
my ($cmd, $server) = @_;
|
my ($cmd, $server) = @_;
|
||||||
return unless Irssi::settings_get_bool("scriptassist_check_unknown_commands");
|
return unless Irssi::settings_get_bool("scriptassist_check_unknown_commands");
|
||||||
|
return if ($cmd =~ /^\d+$/ && $irssi_version >= v1.2.0 && Irssi::settings_get_bool("window_number_commands"));
|
||||||
bg_do('unknown '.$cmd);
|
bg_do('unknown '.$cmd);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1213,11 +1246,11 @@ foreach my $cmd ( ( 'check',
|
|||||||
'search',
|
'search',
|
||||||
# '-h',
|
# '-h',
|
||||||
'help',
|
'help',
|
||||||
# 'ratings',
|
'ratings',
|
||||||
# 'rate',
|
'rate',
|
||||||
'info',
|
'info',
|
||||||
# 'echo',
|
# 'echo',
|
||||||
# 'top',
|
'top',
|
||||||
'cpan',
|
'cpan',
|
||||||
'autorun',
|
'autorun',
|
||||||
'new' ) ) {
|
'new' ) ) {
|
||||||
|
@ -322,7 +322,7 @@ static char *expando_last_invite(SERVER_REC *server, void *item, int *free_ret)
|
|||||||
/* client version text string */
|
/* client version text string */
|
||||||
static char *expando_version(SERVER_REC *server, void *item, int *free_ret)
|
static char *expando_version(SERVER_REC *server, void *item, int *free_ret)
|
||||||
{
|
{
|
||||||
return PACKAGE_VERSION "-an";
|
return PACKAGE_VERSION;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* current value of CMDCHARS */
|
/* current value of CMDCHARS */
|
||||||
|
@ -42,7 +42,7 @@ enum {
|
|||||||
MSGLEVEL_HIDDEN = 0x10000000, /* Hidden from view */
|
MSGLEVEL_HIDDEN = 0x10000000, /* Hidden from view */
|
||||||
MSGLEVEL_RESERVED1 = 0x20000000,
|
MSGLEVEL_RESERVED1 = 0x20000000,
|
||||||
MSGLEVEL_RESERVED2 = 0x40000000,
|
MSGLEVEL_RESERVED2 = 0x40000000,
|
||||||
MSGLEVEL_FORMAT = 0x80000000 /* Format data */
|
MSGLEVEL_FORMAT = (int)0x80000000 /* Format data */
|
||||||
};
|
};
|
||||||
/* clang-format on */
|
/* clang-format on */
|
||||||
|
|
||||||
|
@ -124,17 +124,17 @@ static void cmd_server_add_modify(const char *data, gboolean add)
|
|||||||
|
|
||||||
port = old_port = -1;
|
port = old_port = -1;
|
||||||
|
|
||||||
if (*portstr != '\0')
|
value = g_hash_table_lookup(optlist, "port");
|
||||||
port = add_port = atoi(portstr);
|
if (value != NULL && *value != '\0')
|
||||||
|
port = add_port = atoi(value);
|
||||||
else if (g_hash_table_lookup(optlist, "tls") ||
|
else if (g_hash_table_lookup(optlist, "tls") ||
|
||||||
g_hash_table_lookup(optlist, "ssl"))
|
g_hash_table_lookup(optlist, "ssl"))
|
||||||
add_port = DEFAULT_SERVER_ADD_TLS_PORT;
|
add_port = DEFAULT_SERVER_ADD_TLS_PORT;
|
||||||
else
|
else
|
||||||
add_port = DEFAULT_SERVER_ADD_PORT;
|
add_port = DEFAULT_SERVER_ADD_PORT;
|
||||||
|
|
||||||
value = g_hash_table_lookup(optlist, "port");
|
if (*portstr != '\0')
|
||||||
if (value != NULL && *value != '\0')
|
old_port = atoi(portstr);
|
||||||
old_port = atoi(value);
|
|
||||||
|
|
||||||
chatnet = g_hash_table_lookup(optlist, "network");
|
chatnet = g_hash_table_lookup(optlist, "network");
|
||||||
|
|
||||||
@ -307,12 +307,14 @@ static void cmd_server_remove(const char *data)
|
|||||||
SERVER_SETUP_REC *rec;
|
SERVER_SETUP_REC *rec;
|
||||||
char *addr, *port, *chatnet;
|
char *addr, *port, *chatnet;
|
||||||
void *free_arg;
|
void *free_arg;
|
||||||
|
int portnum;
|
||||||
|
|
||||||
if (!cmd_get_params(data, &free_arg, 3, &addr, &port, &chatnet))
|
if (!cmd_get_params(data, &free_arg, 3, &addr, &port, &chatnet))
|
||||||
return;
|
return;
|
||||||
if (*addr == '\0') cmd_param_error(CMDERR_NOT_ENOUGH_PARAMS);
|
if (*addr == '\0') cmd_param_error(CMDERR_NOT_ENOUGH_PARAMS);
|
||||||
|
|
||||||
if (*port == '\0') {
|
if (*port == '\0') {
|
||||||
|
portnum = DEFAULT_SERVER_ADD_PORT;
|
||||||
if (*chatnet == '\0')
|
if (*chatnet == '\0')
|
||||||
rec = server_setup_find(addr, -1, NULL);
|
rec = server_setup_find(addr, -1, NULL);
|
||||||
else
|
else
|
||||||
@ -320,17 +322,21 @@ static void cmd_server_remove(const char *data)
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
portnum = atoi(port);
|
||||||
if (*chatnet == '\0')
|
if (*chatnet == '\0')
|
||||||
rec = server_setup_find(addr, atoi(port), NULL);
|
rec = server_setup_find(addr, portnum, NULL);
|
||||||
else
|
else
|
||||||
rec = server_setup_find(addr, atoi(port), chatnet);
|
rec = server_setup_find(addr, portnum, chatnet);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (rec == NULL)
|
if (rec == NULL)
|
||||||
printformat(NULL, NULL, MSGLEVEL_CLIENTNOTICE, TXT_SETUPSERVER_NOT_FOUND, addr, port);
|
printformat(NULL, NULL, MSGLEVEL_CLIENTNOTICE, TXT_SETUPSERVER_NOT_FOUND, addr,
|
||||||
|
portnum);
|
||||||
else {
|
else {
|
||||||
|
portnum = rec->port;
|
||||||
server_setup_remove(rec);
|
server_setup_remove(rec);
|
||||||
printformat(NULL, NULL, MSGLEVEL_CLIENTNOTICE, TXT_SETUPSERVER_REMOVED, addr, port);
|
printformat(NULL, NULL, MSGLEVEL_CLIENTNOTICE, TXT_SETUPSERVER_REMOVED, addr,
|
||||||
|
portnum);
|
||||||
}
|
}
|
||||||
|
|
||||||
cmd_params_free(free_arg);
|
cmd_params_free(free_arg);
|
||||||
|
@ -22,6 +22,7 @@
|
|||||||
#include <irssi/src/fe-common/core/formats.h>
|
#include <irssi/src/fe-common/core/formats.h>
|
||||||
|
|
||||||
FORMAT_REC fecommon_core_formats[] = {
|
FORMAT_REC fecommon_core_formats[] = {
|
||||||
|
/* clang-format off */
|
||||||
{ MODULE_NAME, "Core", 0 },
|
{ MODULE_NAME, "Core", 0 },
|
||||||
|
|
||||||
/* ---- */
|
/* ---- */
|
||||||
@ -87,8 +88,8 @@ FORMAT_REC fecommon_core_formats[] = {
|
|||||||
{ "server_reconnect_removed", "Removed reconnection to server {server $0} port {hilight $1}", 3, { 0, 1, 0 } },
|
{ "server_reconnect_removed", "Removed reconnection to server {server $0} port {hilight $1}", 3, { 0, 1, 0 } },
|
||||||
{ "server_reconnect_not_found", "Reconnection tag {server $0} not found", 1, { 0 } },
|
{ "server_reconnect_not_found", "Reconnection tag {server $0} not found", 1, { 0 } },
|
||||||
{ "setupserver_added", "Server {server $0} saved", 2, { 0, 1 } },
|
{ "setupserver_added", "Server {server $0} saved", 2, { 0, 1 } },
|
||||||
{ "setupserver_removed", "Server {server $0} removed", 2, { 0, 1 } },
|
{ "setupserver_removed", "Server {server $0} {hilight $1} removed", 2, { 0, 1 } },
|
||||||
{ "setupserver_not_found", "Server {server $0} not found", 2, { 0, 1 } },
|
{ "setupserver_not_found", "Server {server $0} {hilight $1} not found", 2, { 0, 1 } },
|
||||||
{ "your_nick", "Your nickname is {nick $0}", 1, { 0 } },
|
{ "your_nick", "Your nickname is {nick $0}", 1, { 0 } },
|
||||||
|
|
||||||
/* ---- */
|
/* ---- */
|
||||||
@ -316,4 +317,5 @@ FORMAT_REC fecommon_core_formats[] = {
|
|||||||
{ "tls_protocol_version", "Protocol: {hilight $0} ({hilight $1} bit, {hilight $2})", 3, { 0, 1, 0 } },
|
{ "tls_protocol_version", "Protocol: {hilight $0} ({hilight $1} bit, {hilight $2})", 3, { 0, 1, 0 } },
|
||||||
|
|
||||||
{ NULL, NULL, 0 }
|
{ NULL, NULL, 0 }
|
||||||
|
/* clang-format on */
|
||||||
};
|
};
|
||||||
|
@ -265,7 +265,7 @@ static void sig_gui_print_text_finished(WINDOW_REC *window, TEXT_DEST_REC *dest)
|
|||||||
|
|
||||||
info->meta = line_meta_create(dest->meta);
|
info->meta = line_meta_create(dest->meta);
|
||||||
|
|
||||||
info->level |= MSGLEVEL_FORMAT;
|
info->level = dest->level | MSGLEVEL_FORMAT;
|
||||||
|
|
||||||
/* the line will be inserted into the view with textbuffer_view_insert_line by
|
/* the line will be inserted into the view with textbuffer_view_insert_line by
|
||||||
gui-printtext.c:view_add_eol */
|
gui-printtext.c:view_add_eol */
|
||||||
|
@ -63,6 +63,20 @@ IRC_CHANNEL_REC *irc_channel_create(IRC_SERVER_REC *server, const char *name,
|
|||||||
#define get_join_key(key) \
|
#define get_join_key(key) \
|
||||||
(((key) == NULL || *(key) == '\0') ? "x" : (key))
|
(((key) == NULL || *(key) == '\0') ? "x" : (key))
|
||||||
|
|
||||||
|
static char *force_channel_name(IRC_SERVER_REC *server, const char *name)
|
||||||
|
{
|
||||||
|
char *chantypes;
|
||||||
|
|
||||||
|
if (server_ischannel(SERVER(server), name))
|
||||||
|
return g_strdup(name);
|
||||||
|
|
||||||
|
chantypes = g_hash_table_lookup(server->isupport, "chantypes");
|
||||||
|
if (chantypes == NULL || *chantypes == '\0')
|
||||||
|
chantypes = "#";
|
||||||
|
|
||||||
|
return g_strdup_printf("%c%s", *chantypes, name);
|
||||||
|
}
|
||||||
|
|
||||||
static void irc_channels_join(IRC_SERVER_REC *server, const char *data,
|
static void irc_channels_join(IRC_SERVER_REC *server, const char *data,
|
||||||
int automatic)
|
int automatic)
|
||||||
{
|
{
|
||||||
@ -99,8 +113,7 @@ static void irc_channels_join(IRC_SERVER_REC *server, const char *data,
|
|||||||
tmp = chanlist;
|
tmp = chanlist;
|
||||||
for (;; tmp++) {
|
for (;; tmp++) {
|
||||||
if (*tmp != NULL) {
|
if (*tmp != NULL) {
|
||||||
channel = server_ischannel(SERVER(server), *tmp) ? g_strdup(*tmp) :
|
channel = force_channel_name(server, *tmp);
|
||||||
g_strdup_printf("#%s", *tmp);
|
|
||||||
|
|
||||||
chanrec = irc_channel_find(server, channel);
|
chanrec = irc_channel_find(server, channel);
|
||||||
if (chanrec == NULL) {
|
if (chanrec == NULL) {
|
||||||
@ -170,17 +183,14 @@ static void irc_channels_join(IRC_SERVER_REC *server, const char *data,
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* function for finding IRC channels - adds support for !channels */
|
/* function for finding IRC channels - adds support for !channels */
|
||||||
static CHANNEL_REC *irc_channel_find_server(SERVER_REC *server,
|
static CHANNEL_REC *irc_channel_find_server(IRC_SERVER_REC *server, const char *channel)
|
||||||
const char *channel)
|
|
||||||
{
|
{
|
||||||
GSList *tmp;
|
GSList *tmp;
|
||||||
char *fmt_channel;
|
char *fmt_channel;
|
||||||
|
|
||||||
/* if 'channel' has no leading # this lookup is going to fail, add a
|
/* if 'channel' has no leading # this lookup is going to fail, add a
|
||||||
* octothorpe in front of it to handle this case. */
|
* octothorpe in front of it to handle this case. */
|
||||||
fmt_channel = server_ischannel(SERVER(server), channel) ?
|
fmt_channel = force_channel_name(server, channel);
|
||||||
g_strdup(channel) :
|
|
||||||
g_strdup_printf("#%s", channel);
|
|
||||||
|
|
||||||
for (tmp = server->channels; tmp != NULL; tmp = tmp->next) {
|
for (tmp = server->channels; tmp != NULL; tmp = tmp->next) {
|
||||||
CHANNEL_REC *rec = tmp->data;
|
CHANNEL_REC *rec = tmp->data;
|
||||||
@ -189,12 +199,12 @@ static CHANNEL_REC *irc_channel_find_server(SERVER_REC *server,
|
|||||||
continue;
|
continue;
|
||||||
|
|
||||||
/* check both !ABCDEchannel and !channel */
|
/* check both !ABCDEchannel and !channel */
|
||||||
if (IRC_SERVER(server)->nick_comp_func(fmt_channel, rec->name) == 0) {
|
if (server->nick_comp_func(fmt_channel, rec->name) == 0) {
|
||||||
g_free(fmt_channel);
|
g_free(fmt_channel);
|
||||||
return rec;
|
return rec;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (IRC_SERVER(server)->nick_comp_func(fmt_channel, rec->visible_name) == 0) {
|
if (server->nick_comp_func(fmt_channel, rec->visible_name) == 0) {
|
||||||
g_free(fmt_channel);
|
g_free(fmt_channel);
|
||||||
return rec;
|
return rec;
|
||||||
}
|
}
|
||||||
@ -210,7 +220,8 @@ static void sig_server_connected(SERVER_REC *server)
|
|||||||
if (!IS_IRC_SERVER(server))
|
if (!IS_IRC_SERVER(server))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
server->channel_find_func = irc_channel_find_server;
|
server->channel_find_func =
|
||||||
|
(CHANNEL_REC * (*) (SERVER_REC *, const char *) ) irc_channel_find_server;
|
||||||
server->channels_join = (void (*) (SERVER_REC *, const char *, int))
|
server->channels_join = (void (*) (SERVER_REC *, const char *, int))
|
||||||
irc_channels_join;
|
irc_channels_join;
|
||||||
}
|
}
|
||||||
|
@ -84,10 +84,11 @@ static int ischannel_func(SERVER_REC *server, const char *data)
|
|||||||
chantypes = "#&!+"; /* normal, local, secure, modeless */
|
chantypes = "#&!+"; /* normal, local, secure, modeless */
|
||||||
|
|
||||||
statusmsg = g_hash_table_lookup(irc_server->isupport, "statusmsg");
|
statusmsg = g_hash_table_lookup(irc_server->isupport, "statusmsg");
|
||||||
if (statusmsg == NULL)
|
if (statusmsg == NULL && strchr(chantypes, '@') == NULL)
|
||||||
statusmsg = "@";
|
statusmsg = "@";
|
||||||
|
|
||||||
data += strspn(data, statusmsg);
|
if (statusmsg != NULL)
|
||||||
|
data += strspn(data, statusmsg);
|
||||||
|
|
||||||
/* strchr(3) considers the trailing NUL as part of the string, make sure
|
/* strchr(3) considers the trailing NUL as part of the string, make sure
|
||||||
* we didn't advance too much. */
|
* we didn't advance too much. */
|
||||||
@ -282,7 +283,6 @@ static void server_init_1(IRC_SERVER_REC *server)
|
|||||||
irc_cap_toggle(server, CAP_SASL, TRUE);
|
irc_cap_toggle(server, CAP_SASL, TRUE);
|
||||||
}
|
}
|
||||||
|
|
||||||
irc_cap_toggle(server, CAP_MAXLINE, TRUE);
|
|
||||||
irc_cap_toggle(server, CAP_MULTI_PREFIX, TRUE);
|
irc_cap_toggle(server, CAP_MULTI_PREFIX, TRUE);
|
||||||
irc_cap_toggle(server, CAP_EXTENDED_JOIN, TRUE);
|
irc_cap_toggle(server, CAP_EXTENDED_JOIN, TRUE);
|
||||||
irc_cap_toggle(server, CAP_SETNAME, TRUE);
|
irc_cap_toggle(server, CAP_SETNAME, TRUE);
|
||||||
@ -647,24 +647,6 @@ static void sig_server_quit(IRC_SERVER_REC *server, const char *msg)
|
|||||||
g_free(recoded);
|
g_free(recoded);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void cap_maxline(IRC_SERVER_REC *server)
|
|
||||||
{
|
|
||||||
unsigned int maxline = 0;
|
|
||||||
gboolean parse_successful = FALSE;
|
|
||||||
const char *maxline_str;
|
|
||||||
|
|
||||||
maxline_str = g_hash_table_lookup(server->cap_supported, CAP_MAXLINE);
|
|
||||||
if (maxline_str != NULL) {
|
|
||||||
parse_successful = parse_uint(maxline_str, NULL, 10, &maxline);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
if (parse_successful &&
|
|
||||||
maxline >= MAX_IRC_MESSAGE_LEN + 2 /* 2 bytes for CR+LF */) {
|
|
||||||
server->max_message_len = maxline - 2;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void irc_server_send_action(IRC_SERVER_REC *server, const char *target, const char *data)
|
void irc_server_send_action(IRC_SERVER_REC *server, const char *target, const char *data)
|
||||||
{
|
{
|
||||||
char *recoded;
|
char *recoded;
|
||||||
@ -737,6 +719,7 @@ static int server_cmd_timeout(IRC_SERVER_REC *server, gint64 now)
|
|||||||
GString *str;
|
GString *str;
|
||||||
long usecs;
|
long usecs;
|
||||||
char *cmd;
|
char *cmd;
|
||||||
|
int crlf;
|
||||||
|
|
||||||
if (!IS_IRC_SERVER(server))
|
if (!IS_IRC_SERVER(server))
|
||||||
return 0;
|
return 0;
|
||||||
@ -760,15 +743,29 @@ static int server_cmd_timeout(IRC_SERVER_REC *server, gint64 now)
|
|||||||
|
|
||||||
/* send command */
|
/* send command */
|
||||||
str = g_string_new(cmd);
|
str = g_string_new(cmd);
|
||||||
signal_emit("server outgoing modify", 2, server, str);
|
|
||||||
|
if (str->len > 2 && str->str[str->len - 2] == '\r')
|
||||||
|
crlf = 2;
|
||||||
|
else if (str->len > 1 && str->str[str->len - 1] == '\n')
|
||||||
|
crlf = 1;
|
||||||
|
else
|
||||||
|
crlf = 0;
|
||||||
|
|
||||||
|
if (crlf)
|
||||||
|
g_string_truncate(str, str->len - crlf);
|
||||||
|
|
||||||
|
signal_emit("server outgoing modify", 3, server, str, crlf);
|
||||||
if (str->len) {
|
if (str->len) {
|
||||||
|
if (crlf == 2)
|
||||||
|
g_string_append(str, "\r\n");
|
||||||
|
else if (crlf == 1)
|
||||||
|
g_string_append(str, "\n");
|
||||||
|
|
||||||
irc_server_send_data(server, str->str, str->len);
|
irc_server_send_data(server, str->str, str->len);
|
||||||
|
|
||||||
/* add to rawlog without [CR+]LF */
|
/* add to rawlog without [CR+]LF */
|
||||||
if (str->len > 2 && str->str[str->len - 2] == '\r')
|
if (crlf)
|
||||||
str->str[str->len - 2] = '\0';
|
g_string_truncate(str, str->len - crlf);
|
||||||
else if (str->str[str->len - 1] == '\n')
|
|
||||||
str->str[str->len - 1] = '\0';
|
|
||||||
rawlog_output(server->rawlog, str->str);
|
rawlog_output(server->rawlog, str->str);
|
||||||
server_redirect_command(server, str->str, redirect);
|
server_redirect_command(server, str->str, redirect);
|
||||||
}
|
}
|
||||||
@ -1226,7 +1223,6 @@ void irc_servers_init(void)
|
|||||||
signal_add_first("server disconnected", (SIGNAL_FUNC) sig_disconnected);
|
signal_add_first("server disconnected", (SIGNAL_FUNC) sig_disconnected);
|
||||||
signal_add_last("server destroyed", (SIGNAL_FUNC) sig_destroyed);
|
signal_add_last("server destroyed", (SIGNAL_FUNC) sig_destroyed);
|
||||||
signal_add_last("server quit", (SIGNAL_FUNC) sig_server_quit);
|
signal_add_last("server quit", (SIGNAL_FUNC) sig_server_quit);
|
||||||
signal_add("server cap ack " CAP_MAXLINE, (SIGNAL_FUNC) cap_maxline);
|
|
||||||
signal_add("event 670", (SIGNAL_FUNC) event_starttls);
|
signal_add("event 670", (SIGNAL_FUNC) event_starttls);
|
||||||
signal_add("event 451", (SIGNAL_FUNC) event_registerfirst);
|
signal_add("event 451", (SIGNAL_FUNC) event_registerfirst);
|
||||||
signal_add("server cap end", (SIGNAL_FUNC) event_capend);
|
signal_add("server cap end", (SIGNAL_FUNC) event_capend);
|
||||||
@ -1258,7 +1254,6 @@ void irc_servers_deinit(void)
|
|||||||
signal_remove("server disconnected", (SIGNAL_FUNC) sig_disconnected);
|
signal_remove("server disconnected", (SIGNAL_FUNC) sig_disconnected);
|
||||||
signal_remove("server destroyed", (SIGNAL_FUNC) sig_destroyed);
|
signal_remove("server destroyed", (SIGNAL_FUNC) sig_destroyed);
|
||||||
signal_remove("server quit", (SIGNAL_FUNC) sig_server_quit);
|
signal_remove("server quit", (SIGNAL_FUNC) sig_server_quit);
|
||||||
signal_remove("server cap ack " CAP_MAXLINE, (SIGNAL_FUNC) cap_maxline);
|
|
||||||
signal_remove("event 670", (SIGNAL_FUNC) event_starttls);
|
signal_remove("event 670", (SIGNAL_FUNC) event_starttls);
|
||||||
signal_remove("event 451", (SIGNAL_FUNC) event_registerfirst);
|
signal_remove("event 451", (SIGNAL_FUNC) event_registerfirst);
|
||||||
signal_remove("server cap end", (SIGNAL_FUNC) event_capend);
|
signal_remove("server cap end", (SIGNAL_FUNC) event_capend);
|
||||||
|
@ -15,7 +15,6 @@
|
|||||||
#define MAX_IRC_USER_TAGS_LEN 4094
|
#define MAX_IRC_USER_TAGS_LEN 4094
|
||||||
|
|
||||||
#define CAP_LS_VERSION "302"
|
#define CAP_LS_VERSION "302"
|
||||||
#define CAP_MAXLINE "oragono.io/maxline-2"
|
|
||||||
#define CAP_MESSAGE_TAGS "message-tags"
|
#define CAP_MESSAGE_TAGS "message-tags"
|
||||||
#define CAP_SASL "sasl"
|
#define CAP_SASL "sasl"
|
||||||
#define CAP_MULTI_PREFIX "multi-prefix"
|
#define CAP_MULTI_PREFIX "multi-prefix"
|
||||||
|
@ -115,20 +115,34 @@ void irc_send_cmd_full(IRC_SERVER_REC *server, const char *cmd, int irc_send_whe
|
|||||||
|
|
||||||
if (!raw) {
|
if (!raw) {
|
||||||
/* Add CR+LF to command */
|
/* Add CR+LF to command */
|
||||||
g_string_append_c(str, 13);
|
g_string_append(str, "\r\n");
|
||||||
g_string_append_c(str, 10);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (irc_send_when == IRC_SEND_NOW) {
|
if (irc_send_when == IRC_SEND_NOW) {
|
||||||
signal_emit("server outgoing modify", 2, server, str);
|
int crlf;
|
||||||
|
|
||||||
|
if (str->len > 2 && str->str[str->len - 2] == '\r')
|
||||||
|
crlf = 2;
|
||||||
|
else if (str->len > 1 && str->str[str->len - 1] == '\n')
|
||||||
|
crlf = 1;
|
||||||
|
else
|
||||||
|
crlf = 0;
|
||||||
|
|
||||||
|
if (crlf)
|
||||||
|
g_string_truncate(str, str->len - crlf);
|
||||||
|
|
||||||
|
signal_emit("server outgoing modify", 3, server, str, crlf);
|
||||||
if (str->len) {
|
if (str->len) {
|
||||||
|
if (crlf == 2)
|
||||||
|
g_string_append(str, "\r\n");
|
||||||
|
else if (crlf == 1)
|
||||||
|
g_string_append(str, "\n");
|
||||||
|
|
||||||
irc_server_send_data(server, str->str, str->len);
|
irc_server_send_data(server, str->str, str->len);
|
||||||
|
|
||||||
/* add to rawlog without [CR+]LF */
|
/* add to rawlog without [CR+]LF */
|
||||||
if (str->len > 2 && str->str[str->len - 2] == '\r')
|
if (crlf)
|
||||||
str->str[str->len - 2] = '\0';
|
g_string_truncate(str, str->len - crlf);
|
||||||
else if (str->str[str->len - 1] == '\n')
|
|
||||||
str->str[str->len - 1] = '\0';
|
|
||||||
rawlog_output(server->rawlog, str->str);
|
rawlog_output(server->rawlog, str->str);
|
||||||
server_redirect_command(server, str->str, server->redirect_next);
|
server_redirect_command(server, str->str, server->redirect_next);
|
||||||
}
|
}
|
||||||
|
@ -104,7 +104,7 @@ static int sig_check_lag(void)
|
|||||||
|
|
||||||
if (rec->lag_sent != 0) {
|
if (rec->lag_sent != 0) {
|
||||||
/* waiting for lag reply */
|
/* waiting for lag reply */
|
||||||
if (max_lag > 1 && now - rec->lag_sent > max_lag * G_TIME_SPAN_SECOND) {
|
if (max_lag > 1 && now - (rec->lag_sent / G_TIME_SPAN_SECOND) > max_lag) {
|
||||||
/* too much lag, disconnect */
|
/* too much lag, disconnect */
|
||||||
signal_emit("server lag disconnect", 1, rec);
|
signal_emit("server lag disconnect", 1, rec);
|
||||||
rec->connection_lost = TRUE;
|
rec->connection_lost = TRUE;
|
||||||
|
@ -43,13 +43,6 @@ static void event_join(IRC_SERVER_REC *server, const char *data,
|
|||||||
|
|
||||||
g_return_if_fail(data != NULL);
|
g_return_if_fail(data != NULL);
|
||||||
|
|
||||||
if (g_ascii_strcasecmp(nick, server->nick) == 0) {
|
|
||||||
/* You joined, do not massjoin */
|
|
||||||
send_massjoin = FALSE;
|
|
||||||
} else {
|
|
||||||
send_massjoin = TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
params = event_get_params(data, 3, &channel, &account, &realname);
|
params = event_get_params(data, 3, &channel, &account, &realname);
|
||||||
|
|
||||||
ptr = strchr(channel, 7); /* ^G does something weird.. */
|
ptr = strchr(channel, 7); /* ^G does something weird.. */
|
||||||
@ -62,6 +55,19 @@ static void event_join(IRC_SERVER_REC *server, const char *data,
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (g_ascii_strcasecmp(nick, server->nick) == 0) {
|
||||||
|
/* do not overwrite our /UPGRADEd ownnick */
|
||||||
|
if (chanrec->session_rejoin) {
|
||||||
|
g_free(params);
|
||||||
|
return;
|
||||||
|
} else {
|
||||||
|
/* You joined, do not massjoin */
|
||||||
|
send_massjoin = FALSE;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
send_massjoin = TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
/* check that the nick isn't already in nicklist. seems to happen
|
/* check that the nick isn't already in nicklist. seems to happen
|
||||||
sometimes (server desyncs or something?) */
|
sometimes (server desyncs or something?) */
|
||||||
nickrec = nicklist_find(CHANNEL(chanrec), nick);
|
nickrec = nicklist_find(CHANNEL(chanrec), nick);
|
||||||
|
@ -318,13 +318,17 @@ void dcc_chat_input(CHAT_DCC_REC *dcc)
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (ret > 0) {
|
if (ret > 0) {
|
||||||
|
SERVER_REC *server;
|
||||||
char *recoded;
|
char *recoded;
|
||||||
|
|
||||||
dcc->transfd += ret;
|
dcc->transfd += ret;
|
||||||
|
|
||||||
recoded = recode_in(SERVER(dcc->server), str, dcc->nick);
|
server = SERVER(dcc->server);
|
||||||
|
recoded = recode_in(server, str, dcc->nick);
|
||||||
signal_emit("dcc chat message", 2, dcc, recoded);
|
signal_emit("dcc chat message", 2, dcc, recoded);
|
||||||
g_free(recoded);
|
g_free(recoded);
|
||||||
|
if (server != NULL)
|
||||||
|
server_meta_clear_all(server);
|
||||||
}
|
}
|
||||||
} while (ret > 0);
|
} while (ret > 0);
|
||||||
}
|
}
|
||||||
|
@ -49,14 +49,14 @@ textbuffer_view_scroll_line(view, line)
|
|||||||
Irssi::TextUI::TextBufferView view
|
Irssi::TextUI::TextBufferView view
|
||||||
Irssi::TextUI::Line line
|
Irssi::TextUI::Line line
|
||||||
CODE:
|
CODE:
|
||||||
textbuffer_view_scroll_line(view, line->line);
|
textbuffer_view_scroll_line(view, Line(line));
|
||||||
|
|
||||||
Irssi::TextUI::LineCache
|
Irssi::TextUI::LineCache
|
||||||
textbuffer_view_get_line_cache(view, line)
|
textbuffer_view_get_line_cache(view, line)
|
||||||
Irssi::TextUI::TextBufferView view
|
Irssi::TextUI::TextBufferView view
|
||||||
Irssi::TextUI::Line line
|
Irssi::TextUI::Line line
|
||||||
CODE:
|
CODE:
|
||||||
RETVAL = textbuffer_view_get_line_cache(view, line->line);
|
RETVAL = textbuffer_view_get_line_cache(view, Line(line));
|
||||||
OUTPUT:
|
OUTPUT:
|
||||||
RETVAL
|
RETVAL
|
||||||
|
|
||||||
@ -65,7 +65,7 @@ textbuffer_view_remove_line(view, line)
|
|||||||
Irssi::TextUI::TextBufferView view
|
Irssi::TextUI::TextBufferView view
|
||||||
Irssi::TextUI::Line line
|
Irssi::TextUI::Line line
|
||||||
CODE:
|
CODE:
|
||||||
textbuffer_view_remove_line(view, line->line);
|
textbuffer_view_remove_line(view, Line(line));
|
||||||
|
|
||||||
void
|
void
|
||||||
textbuffer_view_remove_all_lines(view)
|
textbuffer_view_remove_all_lines(view)
|
||||||
@ -82,7 +82,7 @@ textbuffer_view_set_bookmark(view, name, line)
|
|||||||
char *name
|
char *name
|
||||||
Irssi::TextUI::Line line
|
Irssi::TextUI::Line line
|
||||||
CODE:
|
CODE:
|
||||||
textbuffer_view_set_bookmark(view, name, line->line);
|
textbuffer_view_set_bookmark(view, name, Line(line));
|
||||||
|
|
||||||
void
|
void
|
||||||
textbuffer_view_set_bookmark_bottom(view, name)
|
textbuffer_view_set_bookmark_bottom(view, name)
|
||||||
|
Loading…
Reference in New Issue
Block a user