diff --git a/modules/profile/api.js b/modules/profile/api.js index 246b741..633c993 100644 --- a/modules/profile/api.js +++ b/modules/profile/api.js @@ -11,8 +11,8 @@ var api = function(dbot) { if(!_.has(this.profiles, server)){ this.profiles[server] = {}; } - this.profiles[server][primary] = {}; - _.defaults(this.profiles[server][primary], this.config.schema); + this.profiles[server][primary.toLowerCase()] = {}; + _.defaults(this.profiles[server][primary.toLowerCase()], this.config.schema); }, /** diff --git a/modules/profile/commands.js b/modules/profile/commands.js index efae49e..a402066 100644 --- a/modules/profile/commands.js +++ b/modules/profile/commands.js @@ -5,7 +5,8 @@ var commands = function(dbot){ "~getprop": function(event){ if(event.params[1]){ - var res = dbot.db.profiles[event.server][event.user.toLowerCase()].profile[event.params[1]]; + var primary = dbot.api.users.resolveUser(event.server, event.user); + var res = dbot.db.profiles[event.server][primary.toLowerCase()].profile[event.params[1]]; if(res){ event.reply(res); } @@ -18,13 +19,32 @@ var commands = function(dbot){ "~setprop": function(event){ if(event.input[1] && event.input[2]){ if(_.has(this.config.schema.profile, event.input[1])){ - dbot.db.profiles[event.server][event.user.toLowerCase()].profile[event.input[1]] = event.input[2]; + var primary = dbot.api.users.resolveUser(event.server, event.user); + dbot.db.profiles[event.server][primary.toLowerCase()].profile[event.input[1]] = event.input[2]; event.reply("Property set, maybe?"); } else{ event.reply("Invalid property. Go home."); } } + }, + + "~profile": function(event){ + if(event.params[1]){ + var primary = dbot.api.users.resolveUser(event.server, event.params[1]); + if(_.has(dbot.db.profiles[event.server], primary.toLowerCase())){ + event.reply("http://"+dbot.config.web.webHost+":"+dbot.config.web.webPort+"/profile/"+event.server+"/"+primary.toLowerCase()); + } + else{ + event.reply("No profile found for "+event.params[1]); + } + } + else{ + event.message = '~profile ' + event.user; + event.action = 'PRIVMSG'; + event.params = event.message.split(' '); + dbot.instance.emit(event); + } } }; commands['~setprop'].regex = [/~setprop ([^ ]+) (.+)/, 3]; diff --git a/modules/profile/config.json b/modules/profile/config.json index 109f7c0..24f5027 100644 --- a/modules/profile/config.json +++ b/modules/profile/config.json @@ -17,5 +17,5 @@ "timezone": null } }, - "dependencies": [ "quotes", "command" ] + "dependencies": [ "quotes", "users", "command" ] } diff --git a/modules/profile/profile.js b/modules/profile/profile.js index c1dc2cb..5d3b146 100644 --- a/modules/profile/profile.js +++ b/modules/profile/profile.js @@ -33,6 +33,10 @@ var profile = function(dbot) { }); }); dbot.save(); + + // Add API Hooks + dbot.api.command.addHook('~setaliasparent', this.api.renameProfile); + dbot.api.command.addHook('~mergeusers', this.api.mergeProfile); }; }; diff --git a/modules/users/pages.js b/modules/users/pages.js index 386f96b..b129338 100644 --- a/modules/users/pages.js +++ b/modules/users/pages.js @@ -28,11 +28,17 @@ var pages = function(dbot) { var chanData = dbot.api.stats.getChanStats(connection, channel, ["freq"]); var chanFreq = []; - for(var i=0; i <= 6; i++){ - for(var j=0; j <= 23; j++){ - chanFreq.push(chanData.fields.freq.raw[i][j]); + + if(chanData){ + for(var i=0; i <= 6; i++){ + for(var j=0; j <= 23; j++){ + chanFreq.push(chanData.fields.freq.raw[i][j]); + } } } + else{ + for (var i = 0; i < 168; i++) chanFreq[i] = 0; + } var userData = { "active": [], "inactive": [], "offline": []}; var reply = dbot.api.stats.getChanUsersStats(connection, channel, [ diff --git a/views/profile/profile.jade b/views/profile/profile.jade index 8588105..8ea224b 100644 --- a/views/profile/profile.jade +++ b/views/profile/profile.jade @@ -71,27 +71,28 @@ block content th Verbosity th Mentions tbody - for chan, key in stats - if stats.hasOwnProperty(key) - tr - td - a(href='/users/'+connection+'/'+encodeURIComponent(key)) - #{key} - span - if chan.online - if chan.active.active - span.label.label-success.tip(data-original-title="#{chan.active.ago}", data-placement="right") Active - else - span.label.label-important.tip(data-original-title="#{chan.active.ago}", data-placement="right") Inactive - else - span.label.tip(data-original-title="#{chan.active.ago}", data-placement="right") Offline - td - #{chan.fields.lines.data} - td - #{chan.fields.words.data} - td - #{chan.fields.lincent.data} - td - #{chan.fields.wpl.data} - td - #{chan.fields.in_mentions.data} + if stats + for chan, key in stats + if stats.hasOwnProperty(key) + tr + td + a(href='/users/'+connection+'/'+encodeURIComponent(key)) + #{key} + span + if chan.online + if chan.active.active + span.label.label-success.tip(data-original-title="#{chan.active.ago}", data-placement="right") Active + else + span.label.label-important.tip(data-original-title="#{chan.active.ago}", data-placement="right") Inactive + else + span.label.tip(data-original-title="#{chan.active.ago}", data-placement="right") Offline + td + #{chan.fields.lines.data} + td + #{chan.fields.words.data} + td + #{chan.fields.lincent.data} + td + #{chan.fields.wpl.data} + td + #{chan.fields.in_mentions.data} diff --git a/views/users/users.jade b/views/users/users.jade index 3f9b3bc..0a6df79 100644 --- a/views/users/users.jade +++ b/views/users/users.jade @@ -9,10 +9,16 @@ block content .chart rect:hover { fill: #000; } + .yTicks { + stroke: #aaa; + stroke-width: 0.5; + } script $(document).ready(function(){ // d3.js Graph + var xlab = 30; + var chartw = 940; var w = 5.595; var h = 120; @@ -21,13 +27,22 @@ block content .range([0,w]); var y = d3.scale.linear() - .domain([0,100]) + .domain([0,d3.max([#{chanFreq}])]) .rangeRound([0,h]); var chart = d3.select($("#chanFreqChart")[0]).append("svg") .attr("class", "chart") .attr("width", w * #{chanFreqLen} - 1) - .attr("height", h); + .attr("height", h + xlab); + + chart.selectAll(".yTicks") + .data(y.ticks(5).slice(1,5)) + .enter().append("svg:line") + .attr("class", "yTicks") + .attr("y1", function(d) { return -1 * y(d) + h; }) + .attr("x1", 0) + .attr("y2", function(d) { return -1 * y(d) + h; }) + .attr("x2", w * #{chanFreqLen}) chart.selectAll("rect") .data([#{chanFreq}]) @@ -36,7 +51,18 @@ block content .attr("y", function(d) { return h - y(d) - .5; }) .attr("width", w) .attr("height", function(d) { return y(d); }) - .attr("title", function(d){ return y(d); }); + .attr("title", function(d){ return d; }); + + chart.selectAll(".rule") + .data(y.ticks(5).slice(1,5)) + .enter().append("text") + .attr("class", "rule") + .attr("y", function(d) { return -1 * y(d) + h; }) + .attr("x", (chartw / 2)+(w/2)) + .attr("text-anchor", "middle") + .attr("font-size", 10) + .attr("dy", 3) + .text(String); chart.append("line") .attr("x1", 0) @@ -45,6 +71,26 @@ block content .attr("y2", h - .5) .style("stroke", "#000"); + chart.selectAll("text.times") + .data(["0", "6", "12", "18","0", "6", "12", "18","0", "6", "12", "18","0", "6", "12", "18" ,"0", "6", "12", "18" ,"0", "6", "12", "18" ,"0", "6", "12", "18"]) + .enter().append("text") + .attr("x", function(d, i){ return ((i * w * 6)+(w/2)); }) + .attr("y", h + 10) + .attr("text-anchor", "middle") + .attr('class', 'name') + .attr("font-size", 10) + .text(String); + + chart.selectAll("text.days") + .data(["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"]) + .enter().append("text") + .attr("x", function(d, i){ return ((i+0.5) * w * 24); }) + .attr("y", h + 25) + .attr("text-anchor", "middle") + .attr('class', 'name') + .attr("font-size", 12) + .text(String); + // Allowing forcing of string stats data to sort as numeric jQuery.extend( jQuery.fn.dataTableExt.oSort, {