enkore / i3pystatus Goto Github PK
View Code? Open in Web Editor NEWA complete replacement for i3status
Home Page: https://i3pystatus.readthedocs.io/
License: MIT License
A complete replacement for i3status
Home Page: https://i3pystatus.readthedocs.io/
License: MIT License
Checklist for unit tests:
The mail-related imports in the main.py.dist file are invalid. I needed to remove them.
Please mention, that python-gobject2 and python-dbus are required to run the thunderbird mail checker.
Since this is now a fully-grown project, consider putting the package into /usr/../site-packages and have a configuration file somewhere in ~/.config. Then, people could start making packages for their linux distributions out of this.
You could include an option for each module, that triggers notifications of the notification deamon, like for example dunst. notify-send. Should be easy to implement and would nicely fit into the project.
Make the output separator configurable.
Hello,
I recently started using j4-make-config, and it looks like the i3status bar color "statusline" is always white, although my themes set it to #073642 or #eee8d5.
Therefore, when I use the colorized light theme, the i3status text is unreadable.
I can only assume that i3pystatus is overriding that value to set it to white, which is a bad idea. Can you remove it and get the colors { statusline $value}
to be used by default?
Thanks in advance
So I do love i3, however sometimes I really want to use dwm because of the tags. However, to do so means that I lose the use of a good status bar. I'm going to try to hack something together for it, but it would be awesome to have it baked into the status thing (maybe even something that can talk directly to the X server for things like dwm). Just think it would be nice.
Hi,
I encounter this kind of issue while trying to install i3pystatus :
File "/usr/local/lib/python2.7/dist-packages/i3pystatus-3.26-py2.7.egg/i3pystatus/core/settings.py", line 50
raise ConfigKeyError(type(self).__name__, key=exc.args[0]) from exc
^
SyntaxError: invalid syntax
Did I miss something ?
Thanks
When I run my configuration file with python it gives this error:
{"version":1,"click_events":true}
[
[{"instance": "139942030595464", "full_text": "error connecting MPD", "name":
"i3pystatus.mpd.MPD"}, {"instance": "139942030595072", "full_text": "\u266a54", "name":
"i3pystatus.pulseaudio.PulseAudio"}, {"instance": "139942030594904", "full_text": "wireless: Missing
Python module 'basiciw'", "name": "i3pystatus.text.Text", "color": "#FF0000"}, {"instance":
"139942030594400", "full_text": "network: Missing Python module 'netifaces'", "name":
"i3pystatus.text.Text", "color": "#FF0000"}, {"instance": "139942049695728", "full_text": "0.04 0.07",
"name": "i3pystatus.load.Load", "color": "#ffffff", "urgent": false}, {"instance": "139942057635624",
"full_text": "Mon 28 Apr 20:25:46", "name": "i3pystatus.clock.Clock", "color": "#ffffff", "urgent": false}]
This is my config:
# -*- coding: utf-8 -*-
import subprocess
from i3pystatus import Status
status = Status(standalone=True)
# Displays clock like this:
# Tue 30 Jul 11:59:46 PM KW31
# ^-- calendar week
status.register("clock",
format="%a %-d %b %X",)
# Shows the average load of the last minute and the last 5 minutes
# (the default value for format is used)
status.register("load")
# Shows your CPU temperature, if you have a Intel CPU
status.register("temp",
format="{temp:.0f}°C",)
# The battery monitor has many formatting options, see README for details
# This would look like this, when discharging (or charging)
# ↓14.22W 56.15% [77.81%] 2h:41m
# And like this if full:
# =14.22W 100.0% [91.21%]
#
# This would also display a desktop notification (via dbus) if the percentage
# goes below 5 percent while discharging. The block will also color RED.
status.register("battery",
format="{status} {consumption:.2f}W [{percentage_design:.2f}%] {remaining:%E%hh:%Mm}",
alert=True,
alert_percentage=5,
status={
"DIS": "(↓)",
"CHR": "(↑)",
"FULL": "(=)",
},)
# This would look like this:
# Discharging 6h:51m
# Displays whether a DHCP client is running
status.register("runwatch",
name="DHCP",
path="/var/run/dhclient*.pid",)
# Shows the address and up/down state of eth0. If it is up the address is shown in
# green (the default value of color_up) and the CIDR-address is shown
# (i.e. 10.10.10.42/24).
# If it's down just the interface name (eth0) will be displayed in red
# (defaults of format_down and color_down)
#
# Note: the network module requires PyPI package netifaces-py3
status.register("network",
interface="enp0s25",
format_up="{v4cidr}",)
# Has all the options of the normal network and adds some wireless specific things
# like quality and network names.
#
# Note: requires both netifaces-py3 and basiciw
status.register("wireless",
interface="wlp3s0",
format_up="{essid} {quality:03.0f}%",)
# Shows disk usage of /
# Format:
#42/128G [86G]
status.register("disk",
path="/",
format="{used}/{total}G [{avail}G]",)
# Shows pulseaudio default sink volume
#
# Note: requires libpulseaudio from PyPI
status.register("pulseaudio",
format="♪{volume}",)
# Shows mpd status
# Format:
# Cloud connected▶Reroute to Remain
status.register("mpd",
format="{title}{status}{album}",
status={
"pause": "▷",
"play": "▶",
"stop": "◾",
},)
status.run()
New README cannot be generated using script "python -m i3pystatus.mkdocs" if some dependencies are missing (gi, alsaaudio...)
While fixing a small bug(#99 ), I stumbled over the rather bad exception handling of the mpd module.
catching "exception" will catch pretty much everything that can occur in this module.
I would like to fix this but don't have time atm, so fell free ;)
Unless somebody already fixed it meanwhile, I will as soon as possibly.
... because temp#_input files now reside in folders like this: /sys/devices/platform/coretemp.0/hwmon/hwmon1
For suggestions, look here: http://stackoverflow.com/questions/2440511/getting-cpu-temperature-using-python
What things in python3 does i3pystatus rely on, and why was the choice made to drop python2?
Seems silly.
Hi,
This is a very minor enhancement proposition. The default color for when the battery is full is #11aa11 (dark green). It is the only module that uses this color. Other modules uses #00FF00, for example the Network when interface is up.
I think it would be more consistent to set the default color for a full battery to be #00FF00 and let the user configure this later on.
i3pystatus
Traceback (most recent call last):
File "/usr/bin/i3pystatus", line 9, in
load_entry_point('i3pystatus==3.26', 'console_scripts', 'i3pystatus')()
File "/usr/lib/python3.3/site-packages/pkg_resources.py", line 357, in load_entry_point
return get_distribution(dist).load_entry_point(group, name)
File "/usr/lib/python3.3/site-packages/pkg_resources.py", line 2394, in load_entry_point
return ep.load()
File "/usr/lib/python3.3/site-packages/pkg_resources.py", line 2108, in load
entry = import(self.module_name, globals(),globals(), ['name'])
File "/usr/lib/python3.3/site-packages/i3pystatus/init.py", line 9, in
from i3pystatus.core.config import Config
File "/usr/lib/python3.3/site-packages/i3pystatus/core/config.py", line 7, in
from i3pystatus.core.util import render_json
ImportError: cannot import name render_json
The program should work regardless of missing imports. If a module cannot be loaded, an error message should be thrown but the remaining modules should work as expected.
http://privatepaste.com/d3988f28d8
--- a/i3pystatus/battery.py
+++ b/i3pystatus/battery.py
@@ -40,12 +40,12 @@ class Battery:
def __init__(self, batinfo):
self.bat = batinfo
self.normalize_µ()
self.normalize_u()
def normalize_µ(self):
for key, µvalue in self.bat.items():
def normalize_u(self):
for key, uvalue in self.bat.items():
if re.match(r"(VOLTAGE|CHARGE|CURRENT|POWER|ENERGY)_(NOW|FULL|MIN)(_DESIGN)?", key):
self.bat[key] = float(µvalue) / 1000000.0
self.bat[key] = float(uvalue) / 1000000.0
def percentage(self, design=False):
return self._percentage("_DESIGN" if design else "") * 100
Is there a way to disable .000. "EX: 525.12345679 to just 525".
See all those add .0000 ect. is a little bit annoying. Since the number are aways changing.
http://privatepaste.com/03972f5b27
--- a/README.tpl.md
+++ b/README.tpl.md
@@ -99,7 +99,7 @@ from network, wireless and pulseaudio in this example):
# This would look like this:
# Discharging 6h:51m
status.register("battery",
format="{status} {remaining_hm}",
format="{status} {remaining:%E%hh:%Mm}",
alert=True,
alert_percentage=5,
status={
--- a/README.md
+++ b/README.md
@@ -99,7 +99,7 @@ from network, wireless and pulseaudio in this example):
# This would look like this:
# Discharging 6h:51m
status.register("battery",
format="{status} {remaining_hm}",
format="{status} {remaining:%E%hh:%Mm}",
alert=True,
alert_percentage=5,
status={
I get this error when I try to run the config. The bar loads but the config settings do not.
Traceback (most recent call last):
File "/home/t3zla/.i3/i3pystatus.py", line 5, in
from i3pystatus import Status
File "/home/t3zla/.i3/i3pystatus.py", line 5, in
from i3pystatus import Status
ImportError: cannot import name Status
When no internet connection is present, the weather module obviously doesn't work. However, when a connection is established again, it doesn't recover and still spits out errors.
i3pystatus can now run on it's own ( 5474980 ), but it can't do everything (yet) what i3status can… the great strength of i3pystatus is and should be better and more versatile configuration :-)
Needed blocks
Already got these; maybe improve on formatting etc.
Hi,
Very minor issue again. The current volume displayed in i3bar is 89%, which is different from the result of pactl list sinks, which displays 90%:
~ $ pactl list sinks Sink #0 State: SUSPENDED Name: alsa_output.pci-0000_00_1b.0.analog-stereo Description: Built-in Audio Analog Stereo Driver: module-alsa-card.c Sample Specification: s16le 2ch 44100Hz Channel Map: front-left,front-right Owner Module: 5 Mute: no Volume: 0: 90% 1: 90% 0: -2,75 dB 1: -2,75 dB balance 0,00 Base Volume: 100% 0,00 dB Monitor Source: alsa_output.pci-0000_00_1b.0.analog-stereo.monitor Latency: 0 usec, configured 0 usec Flags: HARDWARE HW_MUTE_CTRL HW_VOLUME_CTRL DECIBEL_VOLUME LATENCY Properties: alsa.resolution_bits = "16" device.api = "alsa" device.class = "sound" alsa.class = "generic" alsa.subclass = "generic-mix" alsa.name = "92HD91BXX Analog" alsa.id = "92HD91BXX Analog" alsa.subdevice = "0" alsa.subdevice_name = "subdevice #0" alsa.device = "0" alsa.card = "0" alsa.card_name = "HDA Intel PCH" alsa.long_card_name = "HDA Intel PCH at 0xd0610000 irq 47" alsa.driver_name = "snd_hda_intel" device.bus_path = "pci-0000:00:1b.0" sysfs.path = "/devices/pci0000:00/0000:00:1b.0/sound/card0" device.bus = "pci" device.vendor.id = "8086" device.vendor.name = "Intel Corporation" device.product.id = "1e20" device.product.name = "7 Series/C210 Series Chipset Family High Definition Audio Controller" device.form_factor = "internal" device.string = "front:0" device.buffering.buffer_size = "65536" device.buffering.fragment_size = "32768" device.access_mode = "mmap+timer" device.profile.name = "analog-stereo" device.profile.description = "Analog Stereo" device.description = "Built-in Audio Analog Stereo" alsa.mixer_name = "Intel PantherPoint HDMI" alsa.components = "HDA:111d76e0,10280578,00100102 HDA:80862806,80860101,00100000" module-udev-detect.discovered = "1" device.icon_name = "audio-card-pci" Ports: analog-output-speaker: Speakers (priority: 10000) analog-output-headphones: Headphones (priority: 9000, not available) Active Port: analog-output-speaker Formats: pcm
My i3pystatus settings for volume:
status.register("pulseaudio", format=" {volume}%",)
The wireless module has format_up, format_down and detached_down settings. But there is no equivalent for when the interface is no connected. For example, I am using NetworkManager, and when I disconnect the wifi, this is what appears, in green:
() 0%
Which is not very sexy :)
It would be nice to have a setting like for example format_not_connected.
Hi,
I recently upgraded to version 3.30, and my tun0 interface (openvpn) is now detected as 'down'. When I look af ifconfig, the inteface is in state "unknown". I checked all my OpenVPN clients, and each TUN interface is in state "unknown". I think it could be a good idea to have an option "unknown_up" to be able to display OpenVPN interfaces.
Best regards,
Alexis.
Hello,
I have the following code :
status.register("network",
interface="usb0",
format_up="{v4cidr}",)
If there is no usb0 device (i.e. my phone is not plugged for tethering) I get :
Traceback (most recent call last):
File "config.py", line 31, in <module>
format_up="{v4cidr}",)
File "/usr/local/lib/python3.4/dist-packages/i3pystatus/core/__init__.py", line 65, in register
return self.modules.append(module, *args, **kwargs)
File "/usr/local/lib/python3.4/dist-packages/i3pystatus/core/util.py", line 67, in append
module, *args, **kwargs)
File "/usr/local/lib/python3.4/dist-packages/i3pystatus/core/imputil.py", line 46, in instanciate_class_from_module
return self.instanciate_class_from_module(self.get_module(module), *args, **kwargs)
File "/usr/local/lib/python3.4/dist-packages/i3pystatus/core/imputil.py", line 44, in instanciate_class_from_module
return self.get_class(module)(*args, **kwargs)
File "/usr/local/lib/python3.4/dist-packages/i3pystatus/core/settings.py", line 56, in __init__
self.init()
File "/usr/local/lib/python3.4/dist-packages/i3pystatus/network.py", line 89, in init
"Unknown interface {iface}!".format(iface=self.interface))
RuntimeError: Unknown interface usb0!
It's the same for eth0 (I have an ethernet card which devices activates only if the cable is plugged on).
Hi,
Maybe I missed something, but is there an easy way to add own plugins ? In fact, I'd like to add some functionalities to the clock (calendar poping on left click) and to add some personal plugins (dynip stuff for instance).
I'd rather not edit the original plugins, or add them in system owned dirs, but put them in some .i3pystatus folder in my home.
Is it possible to do this ?
Thanks
On Arch Linux (up to date) : when waking laptop from suspend via systemd/lid being closed, following consistently appears in ~/.xsession_error:
no connectionException in Thread-5 at Sun Aug 24 12:15:55 2014
Traceback (most recent call last):
File "/usr/lib/python3.4/site-packages/i3pystatus/core/threading.py", line 68, in call
self.workload()
File "/usr/lib/python3.4/site-packages/i3pystatus/core/modules.py", line 67, in call
self.run()
File "/usr/lib/python3.4/site-packages/i3pystatus/mail/init.py", line 44, in run
unread = sum(map(lambda backend: backend.unread, self.backends))
TypeError: unsupported operand type(s) for +: 'int' and 'NoneType'
In some cases, i3pystatus becomes unresponsive and does not update, requiring Shift+$mod+R (i.e., a reload of i3).
Modules/plugins being used:
grep status i3pystatus.conf ("battery" occurs twice since Lenovo T440S possesses two (2) separate batteries):
status.register("clock",
status.register("weather",
status.register("text",
status.register("battery",
status.register("battery",
status.register("pulseaudio",
status.register("backlight",
status.register("temp",
status.register("text",
status.register("disk",
status.register("mem",
status.register("load",
status.register("cpu_usage",
status.register("shell",
status.register("text",
status.register("shell",
status.register("mail",
status.register("network",
status.register("wireless",
Please let me know if you need additional information and thank you again for this great project.
They changed their website design. They also did not add an open API (to use their API a certification is required which costs about 400 EUR and requires a private key.).
Hi,
could you provide en example how to define mail-imap section in the config file? I've been trying to do that, but I can't get it to work.
Thanks in advance
Y
Hi,
I installed i3pystatus today, and noticed something wrong. The battery status appear as charging, but my battery is already fully charged.
Text appearing in i3bar:
CHR 100.00%
My battery configuration:
status.register("battery",
format="{status} {percentage:.2f}% {remaining:%E%hh:%Mm}",
alert=True,
alert_percentage=5,)
~ $ cat /sys/class/power_supply/BAT0/uevent
POWER_SUPPLY_NAME=BAT0
POWER_SUPPLY_STATUS=Full
POWER_SUPPLY_PRESENT=1
POWER_SUPPLY_TECHNOLOGY=Li-ion
POWER_SUPPLY_CYCLE_COUNT=0
POWER_SUPPLY_VOLTAGE_MIN_DESIGN=11100000
POWER_SUPPLY_VOLTAGE_NOW=12130000
POWER_SUPPLY_CURRENT_NOW=1000
POWER_SUPPLY_CHARGE_FULL_DESIGN=4400000
POWER_SUPPLY_CHARGE_FULL=3544000
POWER_SUPPLY_CHARGE_NOW=3544000
POWER_SUPPLY_CAPACITY=100
POWER_SUPPLY_MODEL_NAME=Dell
POWER_SUPPLY_MANUFACTURER=SANYO
POWER_SUPPLY_SERIAL_NUMBER=687
If I unplug the charger, the right "DIS" status appears.
Please let me know if I can be of further help.
Thanks
Is it any use or should it be removed ?
Hello,
I've been trying to write an extension and I keep getting this error "Module 'Command': missing required options: {'u', 'x', 'a', 'e', 't', 'b', 'l', 'c'}".
Tracing it doesn't show where that exception was raised except that it is every time.
From the python shell I can import my module and execute it without issues.
Thanks.
I've noticed that clicking on several outputs execute differents commands (eg: network runs nm-applet's dialog). However, since this captures click events, using the mouse wheel on the i3pystatus text does not work (it would normally switch workspaces).
I've also found no way to disable click events on i3pystatus, and I really have no use for clicking on the status bar (though I understand that others use this). Meanwhile, the space I have to scroll through workspaces has been reduced to a half.
After some quick research, I found that i3pystatus outputs "click_events":true
when starting up. A setting to set this to false would be very useful. (I found that this is hardcoded here).
Hi,
I've got an error message with current HEAD 1dbbc01 when registering this module:
status.register("mail",
backends=[ notmuchmail.Notmuch ],
email_client="thunderbird",
hide_if_null=False,
interval=10
);
Here is the output with python3.4, looks like I can't add a property which looks just weird to me :/ :
File "/usr/local/lib/python3.4/dist-packages/i3pystatus-3.30-py3.4.egg/i3pystatus/core/threading.py", line 68, in call
self.workload()
File "/usr/local/lib/python3.4/dist-packages/i3pystatus-3.30-py3.4.egg/i3pystatus/core/modules.py", line 67, in call
self.run()
File "/usr/local/lib/python3.4/dist-packages/i3pystatus-3.30-py3.4.egg/i3pystatus/mail/init.py", line 44, in run
unread = sum(map(lambda backend: backend.unread, self.backends))
TypeError: unsupported operand type(s) for +: 'int' and 'property'
Currently all modules reside inside the i3pystatus package. This is ok, but maybe we can come up with something better, especially regarding documentation of modules?
Probably it would be best to just leave them there and document them (examples, usage etc.) using a module docstring.
One could add top-level code in i3pystatus to add a __call__
method to each submodule if a submodule contains a single class derived from Module
. That call would then delegate to the constructor, effectively making the module a callable alias for class construction.
The advantage of that would be less superfluous config files (I mean… honestly, modsde.ModsDeChecker or notmuchmail.NotMuchMailChecker is very verbose).
Here is the output:
[t3zla@Arch ~]$ python ~/.i3/i3stat.py
Traceback (most recent call last):
File "/home/t3zla/.i3/i3stat.py", line 21, in <module>
format="{temp:.0f}\xb0C",)
File "/usr/lib/python3.4/site-packages/i3pystatus/core/__init__.py", line 65, in register
return self.modules.append(module, *args, **kwargs)
File "/usr/lib/python3.4/site-packages/i3pystatus/core/util.py", line 67, in append
module, *args, **kwargs)
File "/usr/lib/python3.4/site-packages/i3pystatus/core/imputil.py", line 46, in instanciate_class_from_module
return self.instanciate_class_from_module(self.get_module(module), *args, **kwargs)
File "/usr/lib/python3.4/site-packages/i3pystatus/core/imputil.py", line 44, in instanciate_class_from_module
return self.get_class(module)(*args, **kwargs)
File "/usr/lib/python3.4/site-packages/i3pystatus/core/settings.py", line 56, in __init__
self.init()
File "/usr/lib/python3.4/site-packages/i3pystatus/temp.py", line 29, in init
"{base_path}/temp*_input".format(base_path=self.base_path))[0]
IndexError: list index out of range
Seems like I got some detail regarding relative imports in i3pystatus.core.imputil wrong.
http://privatepaste.com/198290cae9
--- a/i3pystatus/battery.py
+++ b/i3pystatus/battery.py
@@ -117,7 +117,7 @@ class BatteryChecker(IntervalModule):
("path", "Override the default-generated path"),
("status", "A dictionary mapping ('DIS', 'CHR', 'FULL') to alternative names"),
)
path = None
@@ -171,6 +171,7 @@ class BatteryChecker(IntervalModule):
body=formatp(self.alert_format_body, **fdict),
icon="battery-caution",
urgency=2,
timeout=60,
)
Exception in Thread-2Traceback (most recent call last):
File "/usr/lib/python3.3/site-packages/i3pystatus/core/threads.py", line 26, in call
self.workload()
File "/usr/lib/python3.3/site-packages/i3pystatus/core/modules.py", line 48, in call
self.run()
File "/usr/lib/python3.3/site-packages/i3pystatus/battery.py", line 86, in run
energy_now = battery.ENERGY_NOW
AttributeError: 'Battery' object has no attribute 'ENERGY_NOW'
~ cat /sys/class/power_supply/BAT0/uevent
POWER_SUPPLY_NAME=BAT0
POWER_SUPPLY_STATUS=Full
POWER_SUPPLY_PRESENT=1
POWER_SUPPLY_TECHNOLOGY=Li-ion
POWER_SUPPLY_CYCLE_COUNT=0
POWER_SUPPLY_VOLTAGE_MIN_DESIGN=10800000
POWER_SUPPLY_VOLTAGE_NOW=12512000
POWER_SUPPLY_CURRENT_NOW=0
POWER_SUPPLY_CHARGE_FULL_DESIGN=4698000
POWER_SUPPLY_CHARGE_FULL=4698000
POWER_SUPPLY_CHARGE_NOW=4698000
POWER_SUPPLY_CAPACITY=100
POWER_SUPPLY_MODEL_NAME=Primary
POWER_SUPPLY_MANUFACTURER=Hewlett-Packard
POWER_SUPPLY_SERIAL_NUMBER=61597 2011/02/23
Getting this when running i3pystatus from a pip or AUR install.
Traceback (most recent call last):
File "i3pystatus", line 5, in
from i3pystatus import Status
File "/usr/lib/python2.7/site-packages/i3pystatus/init.py", line 6, in
from i3pystatus.core import Status
File "/usr/lib/python2.7/site-packages/i3pystatus/core/init.py", line 4, in
from threading import Thread
File "/usr/lib/python2.7/site-packages/i3pystatus/core/threading/init.py", line 2, in
from i3pystatus.core.threading.manager import Manager
File "/usr/lib/python2.7/site-packages/i3pystatus/core/threading/manager.py", line 2, in
from i3pystatus.core.util import partition
File "/usr/lib/python2.7/site-packages/i3pystatus/core/util.py", line 47, in
class ModuleList(collections.UserList):
AttributeError: 'module' object has no attribute 'UserList'
Thanks.
I don't see a possibility to display the temperature or the usage of multiple CPU-cores.
I think this is an important feature. Please let me know if I'm wrong.
Currently some modules (and classes) have a Checker
suffix, some don't. Consistent naming would be good. I'd prone towards no suffix at all, that a module here is a "checker" module and not the email program itself is fairly obvious :-)
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.