Merge branch 'updatestats'
This commit is contained in:
commit
3d7cdc9e8d
12 changed files with 6120 additions and 156 deletions
2
.gitignore
vendored
2
.gitignore
vendored
|
@ -6,3 +6,5 @@ vendor/
|
||||||
.bundle
|
.bundle
|
||||||
script/dev.config.py
|
script/dev.config.py
|
||||||
script/__pycache__/*.pyc
|
script/__pycache__/*.pyc
|
||||||
|
script/common/__pycache__/*.pyc
|
||||||
|
\.vscode/\.ropeproject/
|
|
@ -84,6 +84,9 @@
|
||||||
<script src="{{ site.baseurl }}/public/js/cytoscape/cytoscape.min.js"></script>
|
<script src="{{ site.baseurl }}/public/js/cytoscape/cytoscape.min.js"></script>
|
||||||
<script src="{{ site.baseurl }}/public/js/cytoscape/cytoscape-automove.js"></script>
|
<script src="{{ site.baseurl }}/public/js/cytoscape/cytoscape-automove.js"></script>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
{% if page.chartjs %}
|
||||||
|
<script src="{{ site.baseurl }}/public/js/chartjs/Chart.bundle.min.js"></script>
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
<!-- Icons -->
|
<!-- Icons -->
|
||||||
<!-- 16x16 -->
|
<!-- 16x16 -->
|
||||||
|
|
131
pages/channelsstats.md
Normal file
131
pages/channelsstats.md
Normal file
|
@ -0,0 +1,131 @@
|
||||||
|
---
|
||||||
|
layout: page
|
||||||
|
permalink: /channelsstats/
|
||||||
|
title: Statistiques du Chat
|
||||||
|
linktitle: "Statistiques du Chat"
|
||||||
|
linkurl: /channelsstats/
|
||||||
|
description: "Statistiques sur le chat https://coa.crapaud-fou.org"
|
||||||
|
chartjs: true
|
||||||
|
jquery: true
|
||||||
|
---
|
||||||
|
|
||||||
|
Statistiques du <a href="https://coa.crapaud-fou.org">chat</a> (aussi connu sous le nom de mare aux crapauds) :
|
||||||
|
<canvas id="byChannel"></canvas>
|
||||||
|
<canvas id="byTsunamy"></canvas>
|
||||||
|
<canvas id="usersByChannel"></canvas>
|
||||||
|
<script>
|
||||||
|
|
||||||
|
$.getJSON("{{ site.baseurl }}/public/data/messagesByChannel.json", function (datas){
|
||||||
|
updated = datas['updated']
|
||||||
|
|
||||||
|
labels = datas['labels'];
|
||||||
|
|
||||||
|
var ctx = document.getElementById('byChannel').getContext('2d');
|
||||||
|
var chart = new Chart(ctx, {
|
||||||
|
// The type of chart we want to create
|
||||||
|
type: 'bar',
|
||||||
|
|
||||||
|
// The data for our dataset
|
||||||
|
data: {
|
||||||
|
labels: labels,
|
||||||
|
datasets: datas['messagesByChannel'],
|
||||||
|
},
|
||||||
|
|
||||||
|
// Configuration options go here
|
||||||
|
options: {
|
||||||
|
legend: {
|
||||||
|
display: false
|
||||||
|
},
|
||||||
|
title: {
|
||||||
|
display: true,
|
||||||
|
text: "Nombre de message par canaux (" + updated + ")",
|
||||||
|
position: "top"
|
||||||
|
},
|
||||||
|
responsive: true,
|
||||||
|
scales: {
|
||||||
|
xAxes: [{
|
||||||
|
stacked: true
|
||||||
|
}],
|
||||||
|
yAxes: [{
|
||||||
|
stacked: true,
|
||||||
|
ticks: {
|
||||||
|
stepSize: 500
|
||||||
|
}
|
||||||
|
}]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
var ctx2 = document.getElementById('byTsunamy').getContext('2d');
|
||||||
|
var chart2 = new Chart(ctx2, {
|
||||||
|
// The type of chart we want to create
|
||||||
|
type: 'bar',
|
||||||
|
|
||||||
|
// The data for our dataset
|
||||||
|
data: {
|
||||||
|
labels: labels,
|
||||||
|
datasets: datas['messagesByTsunamy'],
|
||||||
|
},
|
||||||
|
|
||||||
|
// Configuration options go here
|
||||||
|
options: {
|
||||||
|
legend: {
|
||||||
|
display: false
|
||||||
|
},
|
||||||
|
title: {
|
||||||
|
display: true,
|
||||||
|
text: "Nombre de message par Tsunami (" + updated + ")",
|
||||||
|
position: "top"
|
||||||
|
},
|
||||||
|
responsive: true,
|
||||||
|
scales: {
|
||||||
|
xAxes: [{
|
||||||
|
stacked: true
|
||||||
|
}],
|
||||||
|
yAxes: [{
|
||||||
|
stacked: true,
|
||||||
|
ticks: {
|
||||||
|
stepSize: 500
|
||||||
|
}
|
||||||
|
}]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
var ctx3 = document.getElementById('usersByChannel').getContext('2d');
|
||||||
|
var chart3 = new Chart(ctx3, {
|
||||||
|
// The type of chart we want to create
|
||||||
|
type: 'bar',
|
||||||
|
|
||||||
|
// The data for our dataset
|
||||||
|
data: {
|
||||||
|
labels: labels,
|
||||||
|
datasets: datas['usersByChannel'],
|
||||||
|
},
|
||||||
|
|
||||||
|
// Configuration options go here
|
||||||
|
options: {
|
||||||
|
legend: {
|
||||||
|
display: false
|
||||||
|
},
|
||||||
|
title: {
|
||||||
|
display: true,
|
||||||
|
text: "Nombre d'utilisateur actifs par canaux (" + updated + ")",
|
||||||
|
position: "top"
|
||||||
|
},
|
||||||
|
responsive: true,
|
||||||
|
scales: {
|
||||||
|
xAxes: [{
|
||||||
|
stacked: true
|
||||||
|
}],
|
||||||
|
yAxes: [{
|
||||||
|
stacked: true,
|
||||||
|
ticks: {
|
||||||
|
stepSize: 50
|
||||||
|
}
|
||||||
|
}]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
</script>
|
File diff suppressed because one or more lines are too long
5765
public/data/channelsstat.json
Normal file
5765
public/data/channelsstat.json
Normal file
File diff suppressed because it is too large
Load diff
7
public/js/chartjs/Chart.bundle.min.js
vendored
Normal file
7
public/js/chartjs/Chart.bundle.min.js
vendored
Normal file
File diff suppressed because one or more lines are too long
|
@ -1,5 +1,4 @@
|
||||||
# getchannels
|
# installation
|
||||||
## installation
|
|
||||||
## pre-requis
|
## pre-requis
|
||||||
Il faut Python 3 & pip car le code est fait en python.
|
Il faut Python 3 & pip car le code est fait en python.
|
||||||
## Installation
|
## Installation
|
||||||
|
@ -13,8 +12,25 @@ Il faut créer un fichier dev_config.py avec ses infos de connection au Rocket.c
|
||||||
'user' : 'username',
|
'user' : 'username',
|
||||||
'password': 'pwd'
|
'password': 'pwd'
|
||||||
}
|
}
|
||||||
# Lancer
|
# Get Channels
|
||||||
|
Permet de générer les infos pour la page
|
||||||
|
https://crapaud-fou.org/channelslist/
|
||||||
|
## Lancer
|
||||||
python getchannels.py
|
python getchannels.py
|
||||||
|
|
||||||
# Commit
|
## Commit
|
||||||
Un fichier sera créé dans le répertoire [../public/data/result.json](../public/data/result.json)
|
Des fichiers seront créé
|
||||||
|
* [../public/data/channelslist.json](../public/data/channelslist.json)
|
||||||
|
* [../public/data/cohortescolor.json](../public/data/cohortescolor.json)
|
||||||
|
* [../public/data/cohorteslist.json](../public/data/cohorteslist.json)
|
||||||
|
|
||||||
|
# Get Stats
|
||||||
|
Permet de générer les infos pour la page
|
||||||
|
https://crapaud-fou.org/channelsstats/
|
||||||
|
|
||||||
|
## Lancer
|
||||||
|
python getstats.py
|
||||||
|
|
||||||
|
## Commit
|
||||||
|
Un fichier sera créé
|
||||||
|
* [../public/data/channelsstat.json](../public/data/channelsstat.json)
|
39
script/common/channelhelper.py
Normal file
39
script/common/channelhelper.py
Normal file
|
@ -0,0 +1,39 @@
|
||||||
|
def getNodesOrigin(channel):
|
||||||
|
nodes = []
|
||||||
|
if 'description' not in channel:
|
||||||
|
nodes.append("global")
|
||||||
|
return nodes
|
||||||
|
|
||||||
|
if channel['description'].find("#projet") != -1:
|
||||||
|
nodes.append("project")
|
||||||
|
if channel['description'].find("#democratie") != -1:
|
||||||
|
nodes.append("democratie")
|
||||||
|
if channel['description'].find("#ecologie") != -1:
|
||||||
|
nodes.append("ecologie")
|
||||||
|
if channel['description'].find("#technologie") != -1:
|
||||||
|
nodes.append("technologie")
|
||||||
|
|
||||||
|
if not nodes:
|
||||||
|
nodes.append("global")
|
||||||
|
|
||||||
|
return nodes
|
||||||
|
|
||||||
|
def getTsunamy(channel):
|
||||||
|
value = Tsunami.GLOBAL
|
||||||
|
if 'description' in channel:
|
||||||
|
if channel['description'].find("#projet") != -1:
|
||||||
|
value |= Tsunami.PROJECT
|
||||||
|
if channel['description'].find("#democratie") != -1:
|
||||||
|
value |= Tsunami.DEMOCRACY
|
||||||
|
if channel['description'].find("#ecologie") != -1:
|
||||||
|
value |= Tsunami.ECOLOGY
|
||||||
|
if channel['description'].find("#technologie") != -1:
|
||||||
|
value |= Tsunami.TECHNOLOGY
|
||||||
|
return value
|
||||||
|
|
||||||
|
class Tsunami:
|
||||||
|
GLOBAL = 1 << 0
|
||||||
|
PROJECT = 1 << 1
|
||||||
|
DEMOCRACY = 1 << 2
|
||||||
|
ECOLOGY = 1 << 3
|
||||||
|
TECHNOLOGY = 1 << 4
|
|
@ -9,26 +9,7 @@ import json
|
||||||
import dev_config as cfg
|
import dev_config as cfg
|
||||||
import os
|
import os
|
||||||
import re
|
import re
|
||||||
|
from common.channelhelper import getNodesOrigin
|
||||||
def getNodesOrigin(channel):
|
|
||||||
nodes = []
|
|
||||||
if 'description' not in channel:
|
|
||||||
nodes.append("global")
|
|
||||||
return nodes
|
|
||||||
|
|
||||||
if channel['description'].find("#projet") != -1:
|
|
||||||
nodes.append("project")
|
|
||||||
if channel['description'].find("#democratie") != -1:
|
|
||||||
nodes.append("democratie")
|
|
||||||
if channel['description'].find("#ecologie") != -1:
|
|
||||||
nodes.append("ecologie")
|
|
||||||
if channel['description'].find("#technologie") != -1:
|
|
||||||
nodes.append("technologie")
|
|
||||||
|
|
||||||
if not nodes:
|
|
||||||
nodes.append("global")
|
|
||||||
|
|
||||||
return nodes
|
|
||||||
|
|
||||||
colorInfo = {
|
colorInfo = {
|
||||||
'global': 'orange',
|
'global': 'orange',
|
||||||
|
@ -73,7 +54,7 @@ while True:
|
||||||
for channel in channels['channels']:
|
for channel in channels['channels']:
|
||||||
if channel['name'].find('cohorte') != -1:
|
if channel['name'].find('cohorte') != -1:
|
||||||
if 'description' in channel:
|
if 'description' in channel:
|
||||||
m = re.findall('#([\w-]+)', channel['description'])
|
m = re.findall(r'#([\w-]+)', channel['description'])
|
||||||
for region in m:
|
for region in m:
|
||||||
cohortescolor.update( { region: 'green' } )
|
cohortescolor.update( { region: 'green' } )
|
||||||
cohortes.update( { region: { 'link': channel['name']}})
|
cohortes.update( { region: { 'link': channel['name']}})
|
||||||
|
|
148
script/getstats.py
Normal file
148
script/getstats.py
Normal file
|
@ -0,0 +1,148 @@
|
||||||
|
# coding: utf8
|
||||||
|
|
||||||
|
# toutes les chaines sont en unicode (même les docstrings)
|
||||||
|
from __future__ import unicode_literals
|
||||||
|
|
||||||
|
from pprint import pprint
|
||||||
|
from rocketchat_API.rocketchat import RocketChat
|
||||||
|
import json
|
||||||
|
import dev_config as cfg
|
||||||
|
import os
|
||||||
|
import random
|
||||||
|
from datetime import datetime
|
||||||
|
from monthdelta import monthdelta
|
||||||
|
from common.channelhelper import getTsunamy
|
||||||
|
from common.channelhelper import Tsunami
|
||||||
|
|
||||||
|
def getColor():
|
||||||
|
r = random.randrange(255)
|
||||||
|
g = random.randrange(255)
|
||||||
|
b = random.randrange(255)
|
||||||
|
return 'rgb({:0},{:0},{:0})'.format(r,g,b)
|
||||||
|
|
||||||
|
rocket = RocketChat(cfg.rocket['user'], cfg.rocket['password'],
|
||||||
|
server_url='https://coa.crapaud-fou.org')
|
||||||
|
index = 0
|
||||||
|
labels = [None] * 12
|
||||||
|
messagesByChannel = []
|
||||||
|
messagesByTsunamy = []
|
||||||
|
usersByChannel = []
|
||||||
|
messagesDataTsunamy = {
|
||||||
|
"global": [0] * 12,
|
||||||
|
"project": [0] * 12,
|
||||||
|
"democraty": [0] * 12,
|
||||||
|
"ecology": [0] * 12,
|
||||||
|
"technology": [0] * 12,
|
||||||
|
}
|
||||||
|
|
||||||
|
now = datetime.now()
|
||||||
|
date = datetime(now.year, now.month, now.day, 0,0,0)
|
||||||
|
|
||||||
|
info = {
|
||||||
|
"updated": "updated {:02}/{:02}/{:04}".format(now.day, now.month, now.year),
|
||||||
|
"labels": labels,
|
||||||
|
"messagesByChannel": messagesByChannel,
|
||||||
|
"usersByChannel": usersByChannel,
|
||||||
|
"messagesByTsunamy": [{
|
||||||
|
"label": "global",
|
||||||
|
"backgroundColor": getColor(),
|
||||||
|
"data": messagesDataTsunamy['global']
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "projet",
|
||||||
|
"backgroundColor": getColor(),
|
||||||
|
"data": messagesDataTsunamy['project']
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "democratie",
|
||||||
|
"backgroundColor": getColor(),
|
||||||
|
"data": messagesDataTsunamy['democraty']
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "ecologie",
|
||||||
|
"backgroundColor": getColor(),
|
||||||
|
"data": messagesDataTsunamy['ecology']
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "technologie",
|
||||||
|
"backgroundColor": getColor(),
|
||||||
|
"data": messagesDataTsunamy['technology']
|
||||||
|
}]
|
||||||
|
}
|
||||||
|
|
||||||
|
while True:
|
||||||
|
channels = rocket.channels_list(offset=index).json()
|
||||||
|
totalChannels = channels['total']
|
||||||
|
|
||||||
|
for channel in channels['channels']:
|
||||||
|
dataMess = []
|
||||||
|
dataUsers = []
|
||||||
|
pprint( channel['name'] )
|
||||||
|
begin = date - monthdelta(12)
|
||||||
|
end = begin + monthdelta(1)
|
||||||
|
|
||||||
|
tsunamy = getTsunamy(channel)
|
||||||
|
|
||||||
|
for id in range(0, 12):
|
||||||
|
labels[id] = begin.strftime("%b %Y")
|
||||||
|
begindate = begin.isoformat()
|
||||||
|
enddate = end.isoformat()
|
||||||
|
resultMess = rocket.channels_history(channel['_id'], oldest= begindate, latest=enddate, count= 10000).json()
|
||||||
|
lenght = len(resultMess['messages'])
|
||||||
|
dataMess.append(lenght)
|
||||||
|
|
||||||
|
if lenght > 0:
|
||||||
|
if tsunamy & Tsunami.GLOBAL:
|
||||||
|
messagesDataTsunamy['global'][id] += lenght
|
||||||
|
if tsunamy & Tsunami.PROJECT:
|
||||||
|
messagesDataTsunamy['project'][id] += lenght
|
||||||
|
if tsunamy & Tsunami.DEMOCRACY:
|
||||||
|
messagesDataTsunamy['democraty'][id] += lenght
|
||||||
|
if tsunamy & Tsunami.ECOLOGY:
|
||||||
|
messagesDataTsunamy['ecology'][id] += lenght
|
||||||
|
if tsunamy & Tsunami.TECHNOLOGY:
|
||||||
|
messagesDataTsunamy['technology'][id] += lenght
|
||||||
|
|
||||||
|
users = []
|
||||||
|
for mess in resultMess['messages']:
|
||||||
|
users.append(mess['u']['_id'])
|
||||||
|
usersDistinct = set(users)
|
||||||
|
dataUsers.append(len(usersDistinct))
|
||||||
|
else:
|
||||||
|
dataUsers.append(0)
|
||||||
|
|
||||||
|
begin = end
|
||||||
|
end = begin + monthdelta(1)
|
||||||
|
|
||||||
|
color = getColor()
|
||||||
|
messageByChannel = {
|
||||||
|
"label": channel['name'],
|
||||||
|
"backgroundColor": color,
|
||||||
|
"data": dataMess
|
||||||
|
}
|
||||||
|
|
||||||
|
userByChannel = {
|
||||||
|
"label": channel['name'],
|
||||||
|
"backgroundColor": color,
|
||||||
|
"data": dataUsers
|
||||||
|
}
|
||||||
|
|
||||||
|
messagesByChannel.append(messageByChannel)
|
||||||
|
usersByChannel.append(userByChannel)
|
||||||
|
|
||||||
|
if channels['count'] + channels['offset'] >= channels['total']:
|
||||||
|
break
|
||||||
|
index += channels['count']
|
||||||
|
|
||||||
|
# Récupération du répertoire racine du repo
|
||||||
|
rootFolder = os.path.join(os.path.dirname(__file__), '..')
|
||||||
|
# Répertoire pour stocker le fichier de sortie
|
||||||
|
dataFolder = os.path.join(rootFolder, 'public', 'data')
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
statsFilePath = os.path.abspath(
|
||||||
|
os.path.join(dataFolder, 'channelsstat.json'))
|
||||||
|
with open(statsFilePath, "w") as file_write:
|
||||||
|
json.dump(info, file_write)
|
||||||
|
|
|
@ -1 +1,2 @@
|
||||||
rocketchat_API==0.6.32
|
rocketchat_API==0.6.32
|
||||||
|
MonthDelta==0.9.1
|
File diff suppressed because one or more lines are too long
Loading…
Reference in a new issue