212 lines
7.6 KiB
Markdown
212 lines
7.6 KiB
Markdown
|
---
|
||
|
title: "Weechat"
|
||
|
description: "Because lurking is the best"
|
||
|
author: "Thurstylark"
|
||
|
date: 2021-9-25
|
||
|
draft: false
|
||
|
---
|
||
|
|
||
|
|
||
|
Current configuration can always be found at https://git.thurstylark.com/vcsh/weechat.git
|
||
|
|
||
|
##Requirements:
|
||
|
|
||
|
- Not dependent on graphical session (terminal-based client)
|
||
|
- Use only one nick during normal operation
|
||
|
- Use multiple computers interchangeably at random
|
||
|
- Do not require a close/quit process to move between workstations
|
||
|
- Reduce the ammount of join/part messages caused by me
|
||
|
- Be reachable through IRC as much as possible (stay online)
|
||
|
- Have the ability to use a mobile app at will
|
||
|
|
||
|
The best option so far is weechat run in a multiplexer like tmux.
|
||
|
|
||
|
----
|
||
|
## Starting Weechat
|
||
|
|
||
|
Easiest way to get this done is to start weechat at boot with a systemd system service:
|
||
|
|
||
|
```
|
||
|
[Unit]
|
||
|
Description=Start Weechat as relay and client
|
||
|
|
||
|
[Service]
|
||
|
Type=forking
|
||
|
User=thurstylark
|
||
|
Group=thurstylark
|
||
|
ExecStart=/usr/bin/tmux -f /home/thurstylark/.config/srv-tmux.conf new-session -ds weechat weechat
|
||
|
|
||
|
|
||
|
[Install]
|
||
|
WantedBy=multi-user.target
|
||
|
```
|
||
|
|
||
|
### Notes
|
||
|
|
||
|
- When starting tmux with `new-session -d` as its command, tmux forks to the background, thus requiring `Type=forking` in order to let systemd keep track of the process.
|
||
|
- I run this service as my user and group, because I use the default locations for weechat config: `~/.weechat/`. This greatly simplifies weechat configuration.
|
||
|
- tmux configuration needs to be passed to tmux by using `-t /path/to/config`. Full path is used just to be thorough.
|
||
|
|
||
|
----
|
||
|
## Configuring tmux
|
||
|
|
||
|
tmux needs a configuration to disable the status bar, visual bell, and other things that won't be useful in this setup.
|
||
|
|
||
|
```
|
||
|
set -g default-terminal "screen-256color"
|
||
|
|
||
|
set-option -g assume-paste-time 1
|
||
|
set-option -g base-index 1
|
||
|
set-option -g pane-base-index 1
|
||
|
set-option -g default-command ""
|
||
|
set-option -g default-shell "/bin/bash"
|
||
|
set-option -g destroy-unattached off
|
||
|
set-option -g detach-on-destroy on
|
||
|
set-option -g display-panes-active-colour red
|
||
|
set-option -g display-panes-colour blue
|
||
|
set-option -g display-panes-time 1000
|
||
|
set-option -g display-time 750
|
||
|
set-option -g history-limit 10000
|
||
|
set-option -g word-separators " -_@"
|
||
|
set-option -g renumber-windows off
|
||
|
set-option -g repeat-time 500
|
||
|
set-option -g set-remain-on-exit off
|
||
|
set-option -g set-titles off
|
||
|
set-option -g set-titles-string "#S:#I:#W - "#T" #{session_alerts}"
|
||
|
set-option -g status off
|
||
|
|
||
|
- Change prefix to C-a
|
||
|
set-option -g prefix C-a
|
||
|
|
||
|
set-option -g status-style fg=black,bg=cyan
|
||
|
set-option -g message-command-style fg=green,bg=black
|
||
|
set-option -g message-style fg=white,bg=red
|
||
|
set-option -g update-environment "DISPLAY SSH_ASKPASS SSH_AUTH_SOCK SSH_AGENT_PID SSH_CONNECTION WINDOWID XAUTHORITY"
|
||
|
|
||
|
- Set audible bell on, and visual bell off because it is slooooowwwww
|
||
|
set-option -g bell-action any
|
||
|
set-option -g bell-on-alert on
|
||
|
set-option -g visual-bell off
|
||
|
set-option -g visual-silence off
|
||
|
set-option -g visual-activity off
|
||
|
|
||
|
- Pane active colors
|
||
|
set-option -g pane-active-border-style fg=cyan,bright
|
||
|
|
||
|
- Pane inactive colors
|
||
|
set-option -g pane-border-style fg=colour8
|
||
|
|
||
|
- Use C-a,Shift-R to reload configuration
|
||
|
bind R source-file ~/.tmux.conf \; display-message "Config reloaded..."
|
||
|
|
||
|
- Use C-a,a to send prefix to nested session
|
||
|
bind-key a send-prefix
|
||
|
|
||
|
- Use Alt-arrow keys without prefix key to switch panes
|
||
|
bind -n M-Left select-pane -L
|
||
|
bind -n M-Right select-pane -R
|
||
|
bind -n M-Up select-pane -U
|
||
|
bind -n M-Down select-pane -D
|
||
|
- Do the same for HJKL
|
||
|
bind -n M-h select-pane -L
|
||
|
bind -n M-l select-pane -R
|
||
|
bind -n M-k select-pane -U
|
||
|
bind -n M-j select-pane -D
|
||
|
|
||
|
- No delay for escape key press
|
||
|
set -sg escape-time 0
|
||
|
|
||
|
- Various copy mode tweaks
|
||
|
bind-key -t vi-copy Home start-of-line
|
||
|
bind-key -t vi-copy End end-of-line
|
||
|
- Sync copy mode and PRIMARY selection
|
||
|
bind-key -t vi-copy MouseDragEnd1Pane copy-pipe "xsel -i -p -b"
|
||
|
bind-key -t vi-copy Enter copy-pipe "xsel -i -p -b"
|
||
|
bind-key -t vi-copy y copy-pipe "xsel -i -p -b"
|
||
|
```
|
||
|
|
||
|
### Usage
|
||
|
|
||
|
I will usually use this within yet another tmux session, so I end up needing to set up some key bindings to control the differrent sessions
|
||
|
|
||
|
- `C-a a`: Send prefix to the terminal
|
||
|
- `C-a a d`: Disconnect the nested session from this client.
|
||
|
- `C-a a :`: Get command prompt on nested session
|
||
|
|
||
|
----
|
||
|
## Weechat Relay
|
||
|
|
||
|
Here are all the options related to weechat relay:
|
||
|
|
||
|
```
|
||
|
[cmd] (alias.conf)
|
||
|
alias.cmd.norelay = "/buffer set localvar_set_relay hard-hide"
|
||
|
[look] (relay.conf)
|
||
|
relay.look.auto_open_buffer = off (default: on)
|
||
|
relay.look.raw_messages = 256
|
||
|
[color] (relay.conf)
|
||
|
relay.color.client = cyan
|
||
|
relay.color.status_active = lightblue
|
||
|
relay.color.status_auth_failed = lightred
|
||
|
relay.color.status_connecting = yellow
|
||
|
relay.color.status_disconnected = lightred
|
||
|
relay.color.status_waiting_auth = brown
|
||
|
relay.color.text = default
|
||
|
relay.color.text_bg = default
|
||
|
relay.color.text_selected = white
|
||
|
[network] (relay.conf)
|
||
|
relay.network.allow_empty_password = off
|
||
|
relay.network.allowed_ips = ""
|
||
|
relay.network.bind_address = "127.0.0.1" (default: "")
|
||
|
relay.network.clients_purge_delay = 0
|
||
|
relay.network.compression_level = 6
|
||
|
relay.network.ipv6 = off (default: on)
|
||
|
relay.network.max_clients = 5
|
||
|
relay.network.password = "letmein" (default: "")
|
||
|
relay.network.ssl_cert_key = "%h/ssl/relay.pem"
|
||
|
relay.network.ssl_priorities = "NORMAL:-VERS-SSL3.0"
|
||
|
relay.network.websocket_allowed_origins = ""
|
||
|
[irc] (relay.conf)
|
||
|
relay.irc.backlog_max_minutes = 1440
|
||
|
relay.irc.backlog_max_number = 256
|
||
|
relay.irc.backlog_since_last_disconnect = on
|
||
|
relay.irc.backlog_since_last_message = off
|
||
|
relay.irc.backlog_tags = "irc_privmsg"
|
||
|
relay.irc.backlog_time_format = "[%H:%M] "
|
||
|
[port] (relay.conf)
|
||
|
relay.port.weechat = 9001 (default: 0)
|
||
|
```
|
||
|
|
||
|
### Notes
|
||
|
|
||
|
- `alias.cmd.norelay = "/buffer set localvar_set_relay hard-hide`
|
||
|
- Creates the `/norelay` command which is used to hide a buffer from being relayed to any relay client. This is mainly for stopping a buffer from alerting me on mobile.
|
||
|
- `relay.look.auto_open_buffer = off`
|
||
|
- Keeps weechat from opening a buffer with superfluous information every time a client connects or disconnects
|
||
|
- `relay.network.bind_address = "127.0.0.1"`
|
||
|
- Weechat will only accept relay connections from localhost. This means any relay client that wishes to connect will need to tunnel over ssh first, then connect to the relay. Luckily for me, weechat-android does this natively.
|
||
|
- `relay.port.weechat = 9001`
|
||
|
- The relay client will want to know this.
|
||
|
|
||
|
### Reference
|
||
|
|
||
|
- https://weechat.org/files/doc/stable/weechat_user.en.html#relay_plugin
|
||
|
|
||
|
----
|
||
|
## Workstation Client
|
||
|
|
||
|
By far, the most use of weechat will be from a workstation. With this setup, the only requirements of the client is ssh or mosh. I prefer mosh in this case because of it's reconnect capabilities, making it much less painful to keep a session running on a mobile workstation.
|
||
|
|
||
|
Also, the easiest way to launch this connection is to run literally `weechat`, so I set up a couple aliases for this in my `~/.bashrc` (found [here](https://git.thurstylark.com/vcsh/bashrc.git/tree/.bashrc)):
|
||
|
|
||
|
```
|
||
|
# If you don't have weechat installed, connect to the existing tmux session through mosh
|
||
|
[[ ! -s /usr/bin/weechat ]] && alias weechat='mosh vps -- tmux attach -dt weechat'
|
||
|
# If you are thurstylark-vps, connect to the existing tmux session locally
|
||
|
[[ "$HOSTNAME" = "thurstylark-vps" ]] && alias weechat='tmux attach -dt weechat'
|
||
|
```
|
||
|
|
||
|
This gets run when bash starts, so this allows me to use the same `~/.bashrc` on the client and the server. More details on the Bash page.
|
||
|
|
||
|
The only thing not noted is that if the client has weechat installed (to /usr/bin/weechat) and `$HOSTNAME` is not "thurstylark-vps", an alias for 'weechat' will not be created, and weechat will launch normally.
|