Exemple #1
0
def serverInfo(guildId, channelId):
    # Auth and session
    token = session.get('oauth2_token')
    (user, usertoken) = get_user_cache(token, cache)
    check_auth(user, usertoken)

    channelId = channelId if (channelId != None) else guildId

    mysqldb = MySQL(current_app.config['DB_HOST'], current_app.config['DB_USER'], current_app.config['DB_PASS'])
    mysqldb.connect()
    messages = mysqldb.getMessages(channelId)
    nbMessages = len(messages)

    # API calls
    headers = {'authorization': usertoken}
    channel = requests.get(API_BASE_URL + '/channels/' + channelId, headers=headers).json()
    guild    = requests.get(API_BASE_URL + '/guilds/' + guildId, headers=headers).json()
    channels = requests.get(API_BASE_URL + '/guilds/' + guildId + '/channels', headers=headers).json()
    cache['guilds'][guildId] = guild

    guild = cache['guilds'][channel['guild_id']]
    data = {
        'guildId': guildId,
        'channelId': channelId,
        'channels': channels
    }

    channelinfos = {
        'nbmessages' : nbMessages,
        'nbchannels' : 0,
        'firstmessage' : mysqldb.getFirstMessage(channelId),
        'lastmessage' : mysqldb.getLastMessage(channelId)
    }

    # Compute things

    # Render
    return render_template("layout.html", contentTemplate="server-info.html", user=user, server=guild, data=data, channelinfos=channelinfos)
Exemple #2
0
def graph(channelId):
    # Logic
    mysqldb = MySQL(current_app.config['DB_HOST'], current_app.config['DB_USER'], current_app.config['DB_PASS'])
    mysqldb.connect()
    messages = mysqldb.getMessages(channelId)

    # main logic
    count = {}
    label = {}
    for message in messages:
        if message['author_id'] in count:
            count[message['author_id']]  += 1
        else:
            count[message['author_id']] = 1
            label[message['author_id']] = message['author_username']

    nodes = []

    authors = len(count)
    i = 0
    for author in count:
        color = colorsys.hsv_to_rgb(1/authors*i,1,1)
        node = {
            'id': author,
            'label': label[author],
            'color': ('#%02X%02X%02X' % (int(color[0]*255), int(color[1]*255), int(color[2]*255))),
            'value': count[author]
        }
        nodes.append(node)
        i+=1

    #[{from: 1, to: 3, value: 3},..]
    edges = []
    labels = {}
    contentMessages = {}
    days = {}
    dayMember = {}
    mostWord = {}

    for author in count:
        dayMember[author] = {}

    for i in range(1, len(messages)):
        # graph
        key = (messages[i]['author_id'],messages[i-1]['author_id'])
        if key in labels:
            labels[key] += 1
            contentMessages[key]+= (" \n " + messages[i]['content'])
        else:
            labels[key] = 1
            contentMessages[key] = messages[i]['content']
        # time
        timestamp = messages[i]['timestamp']
        d = datetime.date(timestamp.year, timestamp.month, timestamp.day)
        timeKey = calendar.timegm(d.timetuple())
        member = messages[i]['author_id']
        if (timeKey in dayMember[member]):
            dayMember[member][timeKey] += 1
        else:
            dayMember[member][timeKey] = 1
        if (timeKey in days):
            days[timeKey] += 1
        else:
            days[timeKey] = 1

    # --- WORD COUNT ---
    for contentMessage in contentMessages:
        msg = contentMessages[contentMessage]
        words = msg.split()
        filteredEN_words = [word for word in words if word not in getEnglishStopsWords()]
        filteredFR_words = [word for word in filteredEN_words if word not in getFrenchStopsWords()]

        word_counts = Counter(filteredFR_words)
        num_words = sum(word_counts.values())

        lst = [(value, key) for key, value in word_counts.items()]
        lst.sort(reverse=True)

        if len(lst) > 0:
            mostWord[contentMessage] = lst[0]
        else:
            mostWord[contentMessage] = ''



    dayList = {}
    for member in dayMember:
        dayList[member] = []
        daysSorted = sorted(dayMember[member])
        for day in daysSorted:
            dayList[member].append([day*1000, dayMember[member][day]])



    for label in labels:
        edge = {
            'from': label[0],
            'to': label[1],
            'arrows': 'to',
            'label' : mostWord[label][1] if (len(mostWord[label]) >= 2) else '',
            'value': labels[label]
        }
        edges.append(edge)


    # Render
    json = {
        'nodes': nodes,
        'edges': edges,
        'days': dayList
    }

    return jsonify(json)