File size: 4,838 Bytes
62cb7f1
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
import streamlit as st
import os
import random
import hashlib
import json
from datetime import datetime
from collections import Counter
import re

# Function to generate a short user hash
def generate_user_hash():
    if 'user_hash' not in st.session_state:
        session_id = str(random.getrandbits(128))
        hash_object = hashlib.md5(session_id.encode())
        st.session_state['user_hash'] = hash_object.hexdigest()[:8]
    return st.session_state['user_hash']

# Function to load vote history from file
def load_vote_history():
    try:
        with open('vote_history.json', 'r') as f:
            return json.load(f)
    except FileNotFoundError:
        return {'images': {}, 'users': {}, 'words': {}}

# Function to save vote history to file
def save_vote_history(history):
    with open('vote_history.json', 'w') as f:
        json.dump(history, f)

# Function to update vote history in Markdown file
def update_history_md(image_name, user_hash):
    with open('history.md', 'a') as f:
        f.write(f"- {datetime.now().strftime('%Y-%m-%d %H:%M:%S')} - User {user_hash} voted for {image_name}\n")

# Function to extract words from file name
def extract_words(filename):
    words = re.findall(r'\w+', filename.lower())
    return [word for word in words if len(word) > 2]

# Function to update word counts
def update_word_counts(history, image_name):
    words = extract_words(image_name)
    for word in words:
        if word not in history['words']:
            history['words'][word] = 0
        history['words'][word] += 1

# Function to display images
def display_images(image_dir):
    col1, col2 = st.columns(2)
    valid_extensions = ('.png', '.jpg', '.jpeg', '.gif', '.bmp', '.tiff', '.webp')
    images = [f for f in os.listdir(image_dir) if f.lower().endswith(valid_extensions)]
    
    if len(images) < 2:
        st.error("Not enough images in the directory.")
        return
    
    image1, image2 = random.sample(images, 2)
    with col1:
        st.image(os.path.join(image_dir, image1))
        if st.button(f"Upvote {image1}", key=f"upvote_{image1}"):
            handle_vote(image1)
    
    with col2:
        st.image(os.path.join(image_dir, image2))
        if st.button(f"Upvote {image2}", key=f"upvote_{image2}"):
            handle_vote(image2)

# Function to handle voting
def handle_vote(image_name):
    user_hash = generate_user_hash()
    vote_history = load_vote_history()
    
    if image_name not in vote_history['images']:
        vote_history['images'][image_name] = {'votes': 0, 'users': {}}
    
    if user_hash not in vote_history['users']:
        vote_history['users'][user_hash] = 0
    
    vote_history['images'][image_name]['votes'] += 1
    if user_hash not in vote_history['images'][image_name]['users']:
        vote_history['images'][image_name]['users'][user_hash] = 0
    vote_history['images'][image_name]['users'][user_hash] += 1
    vote_history['users'][user_hash] += 1
    
    update_word_counts(vote_history, image_name)
    save_vote_history(vote_history)
    update_history_md(image_name, user_hash)
    st.success(f"Upvoted {image_name}! Total votes: {vote_history['images'][image_name]['votes']}")

# Function to show vote history and user stats in sidebar
def show_vote_history():
    st.sidebar.title("Vote History")
    vote_history = load_vote_history()
    
    # Sort users by total votes
    sorted_users = sorted(vote_history['users'].items(), key=lambda x: x[1], reverse=True)
    
    st.sidebar.subheader("User Vote Totals")
    for user_hash, votes in sorted_users:
        st.sidebar.write(f"User {user_hash}: {votes} votes")
    
    # Sort images by vote count
    sorted_images = sorted(vote_history['images'].items(), key=lambda x: x[1]['votes'], reverse=True)
    
    st.sidebar.subheader("Image Vote Totals")
    for i, (image_name, data) in enumerate(sorted_images):
        votes = data['votes']
        st.sidebar.write(f"{image_name}: {votes} votes")
        
        # Display top 3 images
        if i < 3:
            st.sidebar.image(os.path.join('.', image_name), caption=f"#{i+1}: {image_name}", width=150)
    
    # Display top 3 words
    st.sidebar.subheader("Top 3 Words in Voted Images")
    top_words = sorted(vote_history['words'].items(), key=lambda x: x[1], reverse=True)[:3]
    for word, count in top_words:
        st.sidebar.write(f"{word}: {count} occurrences")

# Main function
def main():
    st.title("Image Voting App")
    
    # Set up the sidebar for vote history and user stats
    show_vote_history()
    
    # Display images for voting
    image_dir = '.'  # Current directory where the app is running
    display_images(image_dir)
    
    # Display user hash
    st.sidebar.subheader("Your User ID")
    st.sidebar.write(generate_user_hash())

# Run the app
if __name__ == "__main__":
    main()