Przeglądaj źródła

minor bugfixes and chartjsgit add .!

tBKwtWS 6 lat temu
rodzic
commit
f55475cbed

+ 1 - 1
rotbot/commands/games.py

@@ -194,7 +194,7 @@ def do_command(self, connection, event, user, channel):
             connection.privmsg(replyto, "AP is earned by using IRC and playing the game in channels with " + font.red + connection.get_nickname() + font.reset + ". Ask any operator in " + font.red + self.network.home_channel + font.reset + " to add a channel. AP is expended for every action you take in the game.")
             connection.privmsg(replyto, "AP is earned by using IRC and playing the game in channels with " + font.red + connection.get_nickname() + font.reset + ". Ask any operator in " + font.red + self.network.home_channel + font.reset + " to add a channel. AP is expended for every action you take in the game.")
     elif command.split()[0] == "coin":
     elif command.split()[0] == "coin":
         if cmdtype == "help":    #Display help text.
         if cmdtype == "help":    #Display help text.
-            connection.privmsg(replyto, "Coin is earned when certain events occur. Coin is used to buy items and classes. To give a player coin use " + font.blue + self.network.command_character + "givecoin" + font.reset + ". Coin affects karma.")
+            connection.privmsg(replyto, "Coin is earned when certain events occur, mostly when other players perform actions. Coin is used to buy items and classes. To give a player coin use " + font.blue + self.network.command_character + "givecoin" + font.reset + ". Coin affects karma.")
     elif command.split()[0] == "karma":
     elif command.split()[0] == "karma":
         if cmdtype == "help":    #Display help text.
         if cmdtype == "help":    #Display help text.
             connection.privmsg(replyto, "Karma is a secret formula, based upon on your IRC events and how you play the game. It does not increase like XP. Some events, skills and items are karma based.")
             connection.privmsg(replyto, "Karma is a secret formula, based upon on your IRC events and how you play the game. It does not increase like XP. Some events, skills and items are karma based.")

+ 1 - 1
rotbot/common/queries.py

@@ -234,7 +234,7 @@ def get_user_gamestats(self, user_id):
 
 
 def levelup_user(self, user_id, xp):
 def levelup_user(self, user_id, xp):
     self.db.run('UPDATE rotbot_user SET level=level+1, xp_spent=xp_spent+%(xp)s, ap_spent=ap_spent+1 WHERE id=%(user_id)s', xp=xp, user_id=user_id)
     self.db.run('UPDATE rotbot_user SET level=level+1, xp_spent=xp_spent+%(xp)s, ap_spent=ap_spent+1 WHERE id=%(user_id)s', xp=xp, user_id=user_id)
-    coin = random.uniform(0.1, 0.5)
+    coin = random.uniform(0.1, 0.9)
     payday(self, coin)
     payday(self, coin)
 
 
 def punish_user(self, user_id, coin, karma):
 def punish_user(self, user_id, coin, karma):

+ 1 - 1
website/rotbot/models.py

@@ -203,7 +203,7 @@ class Channel(models.Model):
         unique_together = ['network', 'name']
         unique_together = ['network', 'name']
 
 
     def __str__(self):
     def __str__(self):
-        return '%s/$s' % (self.network, self.name)
+        return '%s/%s' % (self.network, self.name)
 
 
 class TempChannelKey(models.Model):
 class TempChannelKey(models.Model):
     key = models.CharField(
     key = models.CharField(

+ 47 - 45
website/rotbot/templates/rotbot/user.html

@@ -138,53 +138,55 @@
 
 
   <i class="microphone alternate slash icon"></i>{{ user.no_chat }}
   <i class="microphone alternate slash icon"></i>{{ user.no_chat }}
 
 
-<canvas id="myChart"></canvas>
+<div class="chart-container" style="position: relative;  ">
+  <canvas class="chart" id="chart-ab8d96fb-eb46-434a-9b74-a2f6e6135324"></canvas>
+</div>
+
+<script type="text/javascript">
+window.addEventListener("DOMContentLoaded", function() {
+    var ctx = document.getElementById("chart-ab8d96fb-eb46-434a-9b74-a2f6e6135324").getContext("2d");
+
+    new Chart(ctx, {{ chart|safe }});
+});
+</script>
+
+{% endblock content %}
+
+
+<canvas id="myChart" width="400" height="400"></canvas>
 <script>
 <script>
-  var ctx = document.getElementById('myChart').getContext('2d');
-  var myChart = new Chart(ctx, {
-  type: 'radar',
-  data: {
-    labels: ['Messages', 'Actions', 'Notices', 'Joins', 'Kicks', 'Kicked'],
-    datasets: [{
-      label: 'Statistics per channel',
-      data: [{{ total_messages }}, {{ total_actions }}, {{ total_notices }}, {{ total_joins }}, {{ total_kicks }}, {{ total_kicked }}],
-      backgroundColor: [
-        'rgba(255, 99, 132, 0.2)',
-        'rgba(54, 162, 235, 0.2)',
-        'rgba(255, 206, 86, 0.2)',
-        'rgba(75, 192, 192, 0.2)',
-        'rgba(153, 102, 255, 0.2)',
-        'rgba(255, 159, 64, 0.2)'
-      ],
-      borderColor: [
-        'rgba(255, 99, 132, 1)',
-        'rgba(54, 162, 235, 1)',
-        'rgba(255, 206, 86, 1)',
-        'rgba(75, 192, 192, 1)',
-        'rgba(153, 102, 255, 1)',
-        'rgba(255, 159, 64, 1)'
-      ],
-      borderWidth: 1
-    }]
-  },
-  options: {
-    pointLabels: {
-      display: false,
-    },
-    legend: {
-      display: true,
-      labels: {
-        fontColor: 'rgb(255, 99, 132)'
-      }
+var ctx = document.getElementById('myChart');
+var myChart = new Chart(ctx, {
+    type: 'radar',
+    data: {
+        labels: ['Red', 'Blue', 'Yellow', 'Green', 'Purple', 'Orange'],
+        datasets: [{
+            label: '# of Votes',
+            data: [12, 19, 3, 5, 2, 3],
+            backgroundColor: [
+            'rgba(150.5492475744623109, 150.8156862745098039, 0.4318339100346021)',
+
+            ],
+            borderColor: [
+                'rgba(150.5492475744623109, 150.8156862745098039, 0.4318339100346021)',
+                'hsl(0.3712, 0.33999999999999997, 0.86)',
+                'hsl(0.3712, 0.33999999999999997, 0.86)',
+                'hsl(120, 50%, 50%)',
+                'hsl(120, 50%, 50%)',
+                'hsl(120, 50%, 50%)',
+                'hsl(120, 50%, 50%)',
+            ],
+            borderWidth: 4
+        }]
     },
     },
-    scales: {
-      yAxes: [{
-        ticks: {
-          beginAtZero: true
+    options: {
+        scales: {
+            yAxes: [{
+                ticks: {
+                    beginAtZero: true
+                }
+            }]
         }
         }
-      }]
     }
     }
-    }
-  });
+});
 </script>
 </script>
-{% endblock content %}

+ 172 - 0
website/rotbot/views/general.py

@@ -1,3 +1,4 @@
+import seaborn
 from django.shortcuts import render, get_object_or_404
 from django.shortcuts import render, get_object_or_404
 from django.http import HttpResponseRedirect
 from django.http import HttpResponseRedirect
 from django.urls import reverse
 from django.urls import reverse
@@ -9,6 +10,21 @@ from rotbot.models import Network, Host, Channel, User, Message, Action, Notice,
 from rotbot.forms import CurseWordForm, CurseAdjectiveForm
 from rotbot.forms import CurseWordForm, CurseAdjectiveForm
 from rotbot.views.common import default_keywords, shorten_number, total_messages
 from rotbot.views.common import default_keywords, shorten_number, total_messages
 
 
+# Common
+def user_stats(name, event_stats, stats=False):
+    if not stats:
+        stats = {}
+    if not event_stats:
+        for stat in stats:
+            stats[stat][name] = 0
+    for stat in event_stats:
+        if not stat.channel.name in stats:
+            stats[stat.channel.name] = {}
+        stats[stat.channel.name][name] = stat.amount
+    return stats
+
+
+
 def index(request):
 def index(request):
     networks = Network.objects.all()
     networks = Network.objects.all()
     hosts = Host.objects.all()
     hosts = Host.objects.all()
@@ -39,6 +55,7 @@ def index(request):
     }
     }
     return render(request, 'rotbot/index.html', context)
     return render(request, 'rotbot/index.html', context)
 
 
+
 def user(request, user_slug):
 def user(request, user_slug):
     user = get_object_or_404(User, slug=user_slug)
     user = get_object_or_404(User, slug=user_slug)
     network = Network.objects.get(id=user.network.id)
     network = Network.objects.get(id=user.network.id)
@@ -82,6 +99,58 @@ def user(request, user_slug):
     if user.last_event_type =='sq':
     if user.last_event_type =='sq':
         last_event_type = 'quitting'
         last_event_type = 'quitting'
 
 
+    stats_dict = None
+    stats_dict = user_stats('joins', joins, stats=stats_dict)
+    stats_dict = user_stats('messages', messages, stats=stats_dict)
+    stats_dict = user_stats('actions', actions, stats=stats_dict)
+    stats_dict = user_stats('notices', notices, stats=stats_dict)
+    stats_dict = user_stats('kicks', kicks, stats=stats_dict)
+    stats_dict = user_stats('kicked', kicked, stats=stats_dict)
+
+    labels = list(list(stats_dict.values())[0].keys())
+
+    datasets = []
+    dicts_amount = len(stats_dict)
+    color_palette = seaborn.color_palette("husl", dicts_amount * 5)
+
+    i = 0
+    for color in color_palette:
+        color_list = list(color)
+        color_list[0] *= 255
+        color_list[1] *= 255
+        color_list[2] *= 255
+        color_palette[i] = tuple(color_list)
+        i += 1
+
+
+    i = 0
+    for dict in stats_dict:
+        color_gradient = linear_gradient(color_palette[i], n=87)
+        print(color_gradient)
+        datasets.append({
+            "label": dict,
+            "data": list(stats_dict[dict].values()),
+            "backgroundColor": 'rgba' + str(color_gradient[i]),#, 'rgba' + str(color_gradient[i]), 'rgba' + str(color_gradient[i]), 'rgba' + str(color_gradient[i]), 'rgba' + str(color_gradient[i]), 'rgba' + str(color_gradient[i]),],
+            "borderColor": 'rgba' + str(color_gradient[i+1]),#, 'rgba' + str(color_gradient[i+1]), 'rgba' + str(color_gradient[i+1]), 'rgba' + str(color_gradient[i+1]), 'rgba' + str(color_gradient[i+1]), 'rgba' + str(color_gradient[i+1]),],
+            #"pointBackgroundColor": ['rgba' + str(tuple(color_palette[i+1]))],
+            #"pointBorderColor": ['rgba' + str(tuple(color_palette[i+3]))],
+            #"pointStrokeColor": ['rgba' + str(tuple(color_palette[i+4]))],
+            "hoverBackgroundColor": 'rgba' + str(color_palette[i+5]),#, 'rgba' + str(tuple(color_palette[i+2])), 'rgba' + str(tuple(color_palette[i+2])), 'rgba' + str(tuple(color_palette[i+2])), 'rgba' + str(tuple(color_palette[i+2])),],
+            "hoverBorderColor": 'rgba' + str(color_palette[i+3]),#, 'rgba' + str(tuple(color_palette[i+3])), 'rgba' + str(tuple(color_palette[i+3])), 'rgba' + str(tuple(color_palette[i+3])), 'rgba' + str(tuple(color_palette[i+3])),],
+            #"hoverWidth": 2,
+            "borderWidth": 1,
+            #"borderSkipped": False,
+        })
+        i += 1
+
+    chart =  {
+        "type": "bar",
+        "data": {
+            "labels": labels,
+            "datasets": datasets,
+        },
+        "options": {},
+    }
     context = {
     context = {
         'parent_title': network.name,
         'parent_title': network.name,
         'parent_url': reverse('rotbot:network', args=(network.slug,)),
         'parent_url': reverse('rotbot:network', args=(network.slug,)),
@@ -99,9 +168,112 @@ def user(request, user_slug):
         'total_kicks': shorten_number(kicked.count()),
         'total_kicks': shorten_number(kicked.count()),
         'total_kicked': shorten_number(kicked.count()),
         'total_kicked': shorten_number(kicked.count()),
         'last_event_type': last_event_type,
         'last_event_type': last_event_type,
+        'stats': stats_dict,
+        'chart': chart,
     }
     }
     return render(request, 'rotbot/user.html', context)
     return render(request, 'rotbot/user.html', context)
 
 
+def color_dict(gradient):
+  ''' Takes in a list of RGB sub-lists and returns dictionary of
+    colors in RGB and hex form for use in a graphing function
+    defined later on '''
+  gradients = []
+  for RGB in gradient:
+      gradients.append(tuple((RGB[0], RGB[1], RGB[2])))
+
+  return tuple(gradients)
+# {
+#       "r":[RGB[0] for RGB in gradient],
+#       "g":[RGB[1] for RGB in gradient],
+#       "b":[RGB[2] for RGB in gradient]}
+
+
+def linear_gradient(start_rgb, finish_hex="#FFFFFF", n=10):
+  ''' returns a gradient list of (n) colors between
+    two hex colors. start_hex and finish_hex
+    should be the full six-digit color string,
+    inlcuding the number sign ("#FFFFFF") '''
+  # Starting and ending colors in RGB form
+  #s = hex_to_RGB(start_hex)
+  print(n)
+  s = start_rgb
+  f = hex_to_RGB(finish_hex)
+  # Initilize a list of the output colors with the starting color
+  RGB_list = [s]
+  # Calcuate a color at each evenly spaced value of t from 1 to n
+  for t in range(1, n):
+    # Interpolate RGB vector for color at the current value of t
+    curr_vector = [
+      int(s[j] + (float(t)/(n-1))*(f[j]-s[j]))
+      for j in range(3)
+    ]
+    # Add it to our list of output colors
+    RGB_list.append(curr_vector)
+
+  return color_dict(RGB_list)
+
+def hex_to_RGB(hex):
+  ''' "#FFFFFF" -> [255,255,255] '''
+  # Pass 16 to the integer function for change of base
+  return [int(hex[i:i+2], 16) for i in range(1,6,2)]
+
+
+def RGB_to_hex(RGB):
+  ''' [255,255,255] -> "#FFFFFF" '''
+  # Components need to be integers for hex to make sense
+  RGB = [int(x) for x in RGB]
+  return "#"+"".join(["0{0:x}".format(v) if v < 16 else
+            "{0:x}".format(v) for v in RGB])
+
+# from jchart import Chart
+# from jchart.config import DataSet
+#
+
+# class LineChart(Chart):
+#
+#     chart_type = 'line'
+#
+#     def get_datasets(self, channel_dict, **kwargs):
+#         print(channel_dict)
+#         data = []
+#         for channel in channel_dict:
+#             print(channel)
+#             print(channel_dict[channel])
+#             print(list(channel_dict[channel].values()))
+#             print(channel_dict[channel].keys())
+#             list(channel_dict[channel].values())
+#             data.append(list(channel_dict[channel].values()))
+#             print(data)
+#
+#             a = DataSet(
+#                 data=data[0]
+#             )
+#             foobar = []
+#             for d in data:
+#                 foobar.append(d)
+#         return a
+#         # [
+#         # DataSet(
+#         #     data=data,
+#         #     #color=(55,55,55),
+#         # )]
+#         # [
+#         #     DataSet(
+#         #         data = [69, 30],
+#         #         #data = data
+#         #         color = (255,255,255)
+#         #     ),
+#         #     DataSet(
+#         #         data = [29, 70],
+#         #         #data = data
+#         #         color = (125,125,125)
+#         #     ),
+#         # ]
+#
+#     def get_labels(self, channel_dict, **kwargs):
+#
+#         return ['Red', 'Blue']
+
 
 
 @login_required
 @login_required
 @permission_required('rotbot.add_curseword', raise_exception=True)
 @permission_required('rotbot.add_curseword', raise_exception=True)

+ 1 - 0
website/website/settings.py

@@ -43,6 +43,7 @@ INSTALLED_APPS = [
     'django.contrib.messages',
     'django.contrib.messages',
     'django.contrib.staticfiles',
     'django.contrib.staticfiles',
     'semanticuiforms',  # https://github.com/thetarkus/django-semanticui-forms
     'semanticuiforms',  # https://github.com/thetarkus/django-semanticui-forms
+    #'jchart',   # https://github.com/matthisk/django-jchart
     'core.apps.CoreConfig',
     'core.apps.CoreConfig',
     'knowledgebase.apps.KnowledgebaseConfig',
     'knowledgebase.apps.KnowledgebaseConfig',
     'dancecalendar.apps.DancecalendarConfig',
     'dancecalendar.apps.DancecalendarConfig',