2020-05-02 12:46:40 +00:00
# tg
2019-02-20 18:15:43 +00:00
2020-07-04 10:53:07 +00:00
[![Join telegram chat ](https://img.shields.io/badge/telegram-join%20chat-black.svg )](https://t.me/tg_term)
2020-06-11 10:13:42 +00:00
Telegram terminal client.
2020-05-02 12:46:40 +00:00
2020-06-21 03:43:24 +00:00
![tg screenshot ](tg-screenshot.png )
2020-05-23 04:42:07 +00:00
## Features
- [X] view mediafiles: photo, video, voice/video notes, documents
- [X] ability to send pictures, documents, audio, video
- [X] reply, edit, forward, delete, send messages
- [X] stickers
- [X] notifications
- [X] record and send voice msgs
- [X] auto download files
- [X] toggle chats: pin/unpin, mark as read/unread, mute/unmute
2020-06-24 06:17:00 +00:00
- [X] message history
2020-07-18 10:49:45 +00:00
- [X] list contacts
- [X] show user status
2020-07-26 06:07:25 +00:00
- [X] secret chats
2020-05-23 04:42:07 +00:00
- [ ] search
- [ ] bots (bot keyboard)
2020-05-09 06:34:02 +00:00
2020-07-21 13:38:21 +00:00
2020-07-21 12:03:52 +00:00
## Requirements
2020-05-09 06:34:02 +00:00
2020-07-21 12:03:52 +00:00
To use tg, you'll need to have the following installed:
- [Python 3.8 ](https://www.python.org/downloads/release/python-380/ )
2020-07-21 13:38:21 +00:00
2020-07-21 12:03:52 +00:00
## Optional dependencies
2020-07-22 11:10:41 +00:00
- [terminal-notifier ](https://github.com/julienXX/terminal-notifier ) - for Mac (used by default). You can change it to [dunst ](https://github.com/dunst-project/dunst ) for Linux or any other notifications program (see `NOTIFY_CMD` in configuration)
- [ffmpeg ](https://ffmpeg.org/ ) - to record voice msgs and upload videos.
2020-07-21 12:03:52 +00:00
- [tdlib ](https://tdlib.github.io/td/build.html?language=Python ) - in case of incompatibility with built in package.
For example, macOS:
```sh
brew install tdlib
```
and then set in config `TDLIB_PATH`
- `urlview` to choose urls when there is multiple in message, use `URL_VIEW` in config file to use another app (it should accept urls in stdin)
- to open `stickers` and `animated` ones (thumbnail preview) you need to set in mailcap appropriate handler and have app which will open `webp` file:
```ini
image/webp; mpv %s
```
2020-07-22 11:10:41 +00:00
- [ranger ](https://github.com/ranger/ranger ), [nnn ](https://github.com/jarun/nnn ) - can be used to choose file when sending, customizable with `FILE_PICKER_CMD`
- [fzf ](https://github.com/junegunn/fzf ) - to create groups and secret chats (used for single and multiple user selection)
2020-07-21 13:38:21 +00:00
2020-07-21 12:03:52 +00:00
## Installation
2020-06-12 12:35:38 +00:00
2020-07-21 12:03:52 +00:00
### From PyPI
2020-06-12 12:35:38 +00:00
2020-07-21 12:03:52 +00:00
This option is recommended for production:
2020-05-02 12:46:40 +00:00
2020-06-08 19:53:11 +00:00
```sh
pip3 install tg
2020-07-21 12:03:52 +00:00
tg
2020-06-08 19:53:11 +00:00
```
2020-05-02 12:46:40 +00:00
2020-07-28 12:46:55 +00:00
### From sources
2020-07-21 12:03:52 +00:00
This option is recommended for development:
2020-05-09 06:34:02 +00:00
```sh
2020-07-21 12:03:52 +00:00
git clone https://github.com:paul-nameless/tg.git
2020-05-09 06:34:02 +00:00
cd tg
2020-07-29 03:09:43 +00:00
pip install python-telegram
2020-07-28 12:46:55 +00:00
pip install .
2020-07-21 12:03:52 +00:00
tg
2020-05-02 12:46:40 +00:00
```
2020-05-23 04:42:07 +00:00
2020-07-21 12:03:52 +00:00
### Using Docker
2020-06-23 22:17:04 +00:00
2020-07-21 12:03:52 +00:00
> Please note that voice recordings and notifications won't work when using Docker.
```sh
docker run -it --rm tg
2020-06-23 22:17:04 +00:00
```
2020-07-21 12:03:52 +00:00
### From the AUR
2020-06-08 19:53:11 +00:00
2020-07-26 07:15:12 +00:00
If you're using Arch Linux, you can install tg through [its AUR package ](https://aur.archlinux.org/packages/telegram-tg/ ):
2020-06-08 19:53:11 +00:00
2020-07-21 12:03:52 +00:00
If you're using the `yay` AUR helper, you can install the package with:
```bash
2020-07-26 07:15:12 +00:00
yay -S telegram-tg
2020-07-21 12:03:52 +00:00
```
2020-05-23 04:42:07 +00:00
2020-07-26 07:15:12 +00:00
If you want to use the latest developement version via the AUR you can find it [here ](https://aur.archlinux.org/packages/telegram-tg-git/ )
2020-05-23 04:42:07 +00:00
## Configuration
Config file should be stored at `~/.config/tg/conf.py` . This is simple python file.
### Simple config:
```python
2020-07-22 08:57:56 +00:00
# should start with + (plus) and contain country code
PHONE = "[phone number in international format]"
2020-05-23 04:42:07 +00:00
```
### Advanced configuration:
2020-07-15 20:26:14 +00:00
All configurable variables can be found [here ](https://github.com/paul-nameless/tg/blob/master/tg/config.py )
2020-05-23 04:42:07 +00:00
```python
import os
# You can write anything you want here, file will be executed at start time
# You can keep you sensitive information in password managers or gpg
# encrypted files for example
def get_pass(key):
# retrieves key from password store
return os.popen("pass show {} | head -n 1".format(key)).read().strip()
2020-05-29 09:25:10 +00:00
PHONE = get_pass("i/telegram-phone")
2020-06-11 10:13:42 +00:00
# encrypt you local tdlib database with the key
2020-05-29 09:25:10 +00:00
ENC_KEY = get_pass("i/telegram-enc-key")
2020-05-23 04:42:07 +00:00
2020-06-12 12:50:54 +00:00
# log level for debugging, info by default
2020-05-29 09:25:10 +00:00
LOG_LEVEL = "DEBUG"
2020-06-03 06:32:08 +00:00
# path where logs will be stored (all.log and error.log)
2020-07-13 10:59:59 +00:00
LOG_PATH = os.path.expanduser("~/.local/share/tg/")
2020-05-23 04:42:07 +00:00
# If you have problems with tdlib shipped with the client, you can install and
2020-06-12 12:50:54 +00:00
# use your own, for example:
2020-05-29 09:25:10 +00:00
TDLIB_PATH = "/usr/local/Cellar/tdlib/1.6.0/lib/libtdjson.dylib"
2020-05-23 04:42:07 +00:00
2020-06-20 14:17:05 +00:00
# you can use any other notification cmd, it is simple python string which
2020-05-23 04:42:07 +00:00
# can format title, msg, subtitle and icon_path paramters
# In these exapmle, kitty terminal is used and when notification is pressed
# it will focus on the tab of running tg
2020-06-20 14:17:05 +00:00
NOTIFY_CMD = "/usr/local/bin/terminal-notifier -title {title} -subtitle {subtitle} -message {msg} -appIcon {icon_path} -sound default -execute '/Applications/kitty.app/Contents/MacOS/kitty @ --to unix:/tmp/kitty focus-tab --no-response -m title:tg'"
2020-05-23 04:42:07 +00:00
2020-06-07 05:22:04 +00:00
# You can use your own voice recording cmd but it's better to use default one.
# The voice note must be encoded with the Opus codec, and stored inside an OGG
# container. Voice notes can have only a single audio channel.
2020-06-20 14:17:05 +00:00
VOICE_RECORD_CMD = "ffmpeg -f avfoundation -i ':0' -c:a libopus -b:a 32k {file_path}"
2020-06-11 10:13:42 +00:00
# You can customize chat and msg flags however you want.
# By default words will be used for readability, but you can make
# it as simple as one letter flags like in mutt or add emojies
CHAT_FLAGS = {
"online": "●",
"pinned": "P",
"muted": "M",
2020-06-24 13:18:36 +00:00
# chat is marked as unread
2020-06-11 10:13:42 +00:00
"unread": "U",
2020-06-24 13:18:36 +00:00
# last msg haven't been seen by recipient
"unseen": "✓",
2020-07-09 06:12:26 +00:00
"secret": "🔒",
2020-09-18 13:14:17 +00:00
"seen": "✓✓", # leave empty if you don't want to see it
2020-06-11 10:13:42 +00:00
}
MSG_FLAGS = {
"selected": "*",
"forwarded": "F",
"new": "N",
"unseen": "U",
"edited": "E",
"pending": "...",
"failed": "💩",
2020-09-18 13:14:17 +00:00
"seen": "✓✓", # leave empty if you don't want to see it
2020-06-11 10:13:42 +00:00
}
2020-06-20 06:56:51 +00:00
# use this app to open url when there are multiple
URL_VIEW = 'urlview'
2020-07-01 03:33:11 +00:00
2020-07-01 11:36:15 +00:00
# Specifies range of colors to use for drawing users with
# different colors
# this one uses base 16 colors which should look good by default
USERS_COLORS = tuple(range(2, 16))
# to use 256 colors, set range appropriately
# though 233 looks better, because last colors are black and gray
# USERS_COLORS = tuple(range(233))
2020-07-01 06:43:26 +00:00
# to make one color for all users
# USERS_COLORS = (4,)
2020-07-02 18:00:35 +00:00
# cleanup cache
# Values: N days, None (never)
KEEP_MEDIA = 7
2020-07-15 10:50:35 +00:00
FILE_PICKER_CMD = "ranger --choosefile={file_path}"
# FILE_PICKER_CMD = "nnn -p {file_path}"
2020-08-16 14:43:18 +00:00
MAILCAP_FILE = os.path.expanduser("~/.config/mailcap")
2020-09-22 07:13:13 +00:00
DOWNLOAD_DIR = os.path.expanduser("~/Downloads/") # copy file to this dir
2020-05-23 04:42:07 +00:00
```
2020-06-12 12:35:38 +00:00
### Mailcap file
2020-08-16 14:43:18 +00:00
Mailcap file is used for deciding how to open telegram files (docs, pics, voice notes, etc.). Path to the file can be overriden with `MAILCAP_FILE` in config file.
2020-06-12 12:35:38 +00:00
Example: `~/.mailcap`
```ini
# media
video/*; mpv "%s"
audio/ogg; mpv --speed 1.33 "%s"
audio/mpeg; mpv --no-video "%s"
image/*; qView "%s"
# text
text/html; w3m "%s"
text/html; open -a Firefox "%s"
text/plain; less "%s"
# fallback to vim
text/*; vim "%s"
```
2020-05-23 04:42:07 +00:00
## Keybindings
vi like keybindings are used in the project. Can be used commands like `4j` - 4 lines down.
For navigation arrow keys also can be used.
### Chats:
- `j,k` : move up/down
- `J,K` : move 10 chats up/down
2020-06-20 06:56:51 +00:00
- `g` : go to top chat
2020-05-23 04:42:07 +00:00
- `l` : open msgs of the chat
- `m` : mute/unmute current chat
- `p` : pin/unpin current chat
- `u` : mark read/unread
- `r` : read current chat
2020-07-15 20:26:14 +00:00
- `c` : show list of contacts
2020-07-18 10:49:45 +00:00
- `dd` : delete chat or remove history
2020-07-26 06:07:25 +00:00
- `ng` : create new group chat
- `ns` : create new secret chat
2020-07-21 13:38:21 +00:00
- `/` : search in chats
2020-06-12 02:49:45 +00:00
- `?` : show help
2020-05-23 04:42:07 +00:00
## Msgs:
- `j,k` : move up/down
- `J,K` : move 10 msgs up/down
- `G` : move to the last msg (at the bottom)
- `l` : if video, pics or audio then open app specified in mailcap file, for example:
2020-06-12 12:35:38 +00:00
```ini
2020-05-23 04:42:07 +00:00
# Images
2020-06-12 12:35:38 +00:00
image/png; qView "%s"
audio/*; mpv "%s"
2020-05-23 04:42:07 +00:00
```
2020-06-12 02:49:45 +00:00
if text, open in `less` (to view multiline msgs)
2020-05-23 04:42:07 +00:00
- `e` : edit current msg
2020-07-04 10:53:07 +00:00
- `<space>` : select msg and jump one msg down (use for deletion or forwarding)
- `<ctrl+space>` : same as space but jumps one msg up
2020-06-12 02:49:45 +00:00
- `y` : yank (copy) selected msgs with < space > to internal buffer (for forwarding) and copy current msg text or path to file to clipboard
2020-05-23 04:42:07 +00:00
- `p` : forward (paste) yanked (copied) msgs to current chat
- `dd` : delete msg for everybody (multiple messages will be deleted if selected)
- `i or a` : insert mode, type new message
- `I or A` : open vim to write long msg and send
- `v` : record and send voice message
2020-05-29 09:25:10 +00:00
- `r,R` : reply to a current msg
2020-05-23 04:42:07 +00:00
- `sv` : send video
- `sa` : send audio
- `sp` : send picture
- `sd` : send document
2020-06-20 06:56:51 +00:00
- `o` : open url present in message (if multiple urls, `urlview` will be opened)
2020-05-23 04:42:07 +00:00
- `]` : next chat
- `[` : prev chat
2020-07-26 06:07:25 +00:00
- `u` : show user info (username, bio, phone, etc.)
- `c` : show chat info (e.g. secret chat encryption key, chat id, state, etc.)
2020-06-12 02:49:45 +00:00
- `?` : show help
2020-07-04 05:23:16 +00:00
- `!` : open msg with custom cmd
2020-11-23 12:08:22 +00:00
## Publish
```sh
# increase version in tg/__init__.py
git commit -m 'Release 0.7.0'
git tag v0.7.0
flit publish
git log --pretty=format:"%cn: %s" v0.6.0...v0.7.0 | grep -v -e "Merge pull request" | grep -v "Release"
git push origin master --tags
```