SHARE
TWEET

AMAbot Code

Houshalter Jul 11th, 2015 943 Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. password = "password"
  2.  
  3. var http = require('http');
  4. var natural = require('natural');
  5. fs = require('fs')
  6. brain = require('brain')
  7.  
  8. // Create the configuration
  9. var config = {
  10.         channels: ["##bottest", "#futurology", "#mybots", "#reddit", "#futuristparty", "#AMAbot"],
  11.         server: "irc.snoonet.org",
  12.         botName: "AMAbot",
  13.         sasl: false,
  14.         secure: false,
  15.         password: password
  16. };
  17.  
  18. var maxLength = 500;
  19. var maxNewlines = 6;
  20. var released = 0;
  21. var subredditList = ["askreddit+AskHistorians+askscience+explainlikeimfive", "askmen+askwomen+askculinary", "futurology+philosophy+psychonaut+MachineLearning+learnprogramming", "all"];
  22. var activeChannels = {};
  23. var rawDataset = [];
  24. var defaultChannelSetting = {};
  25.  
  26. var networkSettings = {"layers":[4],"learningRate":0.007072773526373853,"threshold":0,"iterations":2501}
  27. var net;
  28.  
  29. var maxIterations = 3000
  30.  
  31. function makeNet(networkSettings, dataset){
  32.         var net = new brain.NeuralNetwork({
  33.                 hiddenLayers: networkSettings.layers,
  34.                 learningRate: networkSettings.learningRate
  35.         });
  36.         var result = net.train(dataset, {
  37.           errorThresh: networkSettings.threshold,  // error threshold to reach
  38.           iterations: networkSettings.iterations,   // maximum training iterations
  39.           log: false,           // console.log() progress periodically
  40.           logPeriod: 5000        // number of iterations between logging
  41.         })
  42.         //console.log(JSON.stringify(result));
  43.         return net;
  44. }
  45.  
  46. function trainNetwork(dataset, networkSettings, gens){
  47.         var bestErr = Infinity;
  48.         var result;
  49.         for (i=0;i<gens;i++){
  50.                 var newNet = new brain.NeuralNetwork({
  51.                         hiddenLayers: networkSettings.layers,
  52.                         learningRate: networkSettings.learningRate
  53.                 });
  54.                 var newResult = newNet.train(dataset, {
  55.                   errorThresh: networkSettings.threshold,  // error threshold to reach
  56.                   iterations: networkSettings.iterations,   // maximum training iterations
  57.                   log: false,           // console.log() progress periodically
  58.                   logPeriod: 5000        // number of iterations between logging
  59.                 })
  60.                 console.log("error:", newResult.error)
  61.                 if (newResult.error < bestErr){
  62.                         bestErr = newResult.error
  63.                         net = newNet
  64.                         result = newResult
  65.                 }
  66.         }
  67.         return result;
  68. }
  69.  
  70. //randomly split dataset some percent
  71. //create a random network setup
  72. //train network on training data
  73. //test on validation set
  74. //mutate network
  75. //repeat
  76. //if mutated network settings do better, choose previous
  77. //repeat
  78. function hillClimb(rawDataset, percentValidation, gens, mutationRate, callback, timeinterval, maxtime){
  79.         var dataset = extract(rawDataset);
  80.         var validationset = [];
  81.         var trainingset = [];
  82.         for (key in dataset){
  83.                 value = dataset[key]
  84.                 if (Math.random() < percentValidation){
  85.                         validationset.push(value);
  86.                 } else {
  87.                         trainingset.push(value);
  88.                 }
  89.         }
  90.         //
  91.         function testNet(net){
  92.                 var err = 0;
  93.                 for (key in validationset){
  94.                         var result = net.run(validationset[key].input)[0];
  95.                         err += Math.pow((validationset[key].output[0] - result),2);
  96.                         //console.log(validationset[key].output[0], result, (validationset[key].output[0] - result))
  97.                 }
  98.                 return err;
  99.         }
  100.         function testNets(newNet, oldNet){
  101.                 var probNew = 0.5;
  102.                 for (key in validationset){
  103.                         var dat = validationset[key];
  104.                         var oldResult = newNet.run(dat.input)[0];
  105.                         var newResult = oldNet.run(dat.input)[0];
  106.                         var probDataOld = 1 - Math.abs(dat.output - oldResult);
  107.                         var probDataNew = 1 - Math.abs(dat.output - newResult);
  108.                         probNew = (probDataNew*probNew)/(probDataOld*(1-probNew)+probDataNew*probNew);
  109.                         //console.log(probNew, probDataOld, probDataNew);
  110.                 }
  111.                 return probNew;
  112.         }
  113.        
  114.         function mutate(networkSettings){
  115.                 function mutateVal(val, amount, min, max){
  116.                         var newVal = val;
  117.                         if (Math.random()<mutationRate){
  118.                                 newVal += (Math.random()*val/4)-(val/4)/2;
  119.                                 if (newVal > max || newVal < min){
  120.                                         newVal = val;
  121.                                 }
  122.                         }
  123.                         return newVal;
  124.                 }
  125.                 var layers = networkSettings.layers
  126.                 var newLayers = []
  127.                 for (key in layers){
  128.                         var nodes;
  129.                         if (Math.random()<mutationRate/layers.length){
  130.                                 nodes = layers[key]+Math.round((Math.random()*4)-2);
  131.                                 if (nodes <= 1){
  132.                                         nodes = 1;
  133.                                 }
  134.                         } else {
  135.                                 nodes = layers[key]
  136.                         }
  137.                         newLayers[key] = nodes;
  138.                 }
  139.                 if (Math.random()<mutationRate){
  140.                         newLayers.push(Math.round(Math.random()*3+1));
  141.                 }
  142.                 if (Math.random()<mutationRate){
  143.                         newLayers.pop();
  144.                 }
  145.                 var newLearningRate = mutateVal(networkSettings.learningRate, 0.1, 0, 1);
  146.                 var newThreshold = mutateVal(networkSettings.threshold, 0.0000003, 0, 1);
  147.                 var newIterations = Math.min(mutateVal(networkSettings.iterations, 1000, 1, 10000000), maxIterations);
  148.                
  149.                 return {layers: newLayers, learningRate: newLearningRate, threshold: newThreshold, iterations: newIterations};
  150.         }
  151.         var clock = Date.now()
  152.         var oldNet = makeNet(networkSettings, trainingset);
  153.         var oldTime = Date.now() - clock;
  154.         var errOld = testNet(oldNet);
  155.         function begin(i, callback){
  156.                 var newSettings = mutate(networkSettings);
  157.                 //console.log("NewSettings:", JSON.stringify(newSettings));
  158.                 var clock = Date.now()
  159.                 var newNet = makeNet(newSettings, trainingset);
  160.                 var newTime = Date.now() - clock;
  161.                 function callback2(){
  162.                         //var clock = Date.now()
  163.                         //var oldNet = makeNet(networkSettings, trainingset);
  164.                         //var oldTime = Date.now() - clock;
  165.                         //console.log("NewTime: ", newTime/1000, "OldTime:", oldTime/1000);
  166.                         var errNew = testNet(newNet);
  167.                         //var errOld = testNet(oldNet);
  168.                         //var probNew = testNets(newNet, oldNet)
  169.                         //var newBetter = Math.random()<probNew;
  170.                         var newBetter = errNew<errOld
  171.                         //console.log("Probability of New settings:", probNew)
  172.                         console.log("New err:", errNew, "Old Err:", errOld)
  173.                         //if ((newBetter && newTime < maxtime*1000) || (oldTime > maxtime*1000 && newTime < oldTime && newBetter)){
  174.                         if (newBetter){
  175.                                 oldTime = newTime
  176.                                 errOld = errNew
  177.                                 networkSettings = newSettings;
  178.                                 //console.log("Switching to new settings!")
  179.                                 console.log("NewSettings:", i, JSON.stringify(newSettings));
  180.                                 //console.log(JSON.stringify(newSettings));
  181.                                 //console.log(errNew/validationset.length);
  182.                         }
  183.                         if (i<gens){
  184.                                 setTimeout(function(){begin(i+1, callback);},timeinterval)
  185.                         } else {
  186.                                 callback();
  187.                         }
  188.                 }
  189.                 setTimeout(callback2, timeinterval);
  190.         }
  191.         begin(1, callback);
  192. }
  193.  
  194. function test(){
  195.         console.log("done saving");
  196.  
  197.         for (k in rawDataset){
  198.                 if (!("threadNum" in rawDataset[k])){
  199.                         rawDataset[k].threadNum = 1;
  200.                         rawDataset[k].commentNum = 1;
  201.                         console.log("FIXING?")
  202.                 }
  203.         }
  204.  
  205.         /*var dataset = extract(rawDataset)
  206.         console.log(dataset)
  207.         for (k in dataset){
  208.                 console.log(dataset[k]);
  209.         }*/
  210.        
  211.         /*for (k in rawDataset){
  212.                 if (rawDataset[k].thread.id == "feqqk"){
  213.                         console.log("Removing Entry About Moon.");
  214.                 }
  215.         }*/
  216.        
  217.         //hillClimb(rawDataset, 0.3, 10, 0.5)
  218.         var dataset = extract(rawDataset);
  219.         /*var result = net.train(datasets, {
  220.           errorThresh: 0.000001,  // error threshold to reach
  221.           iterations: 20000,   // maximum training iterations
  222.           log: true,           // console.log() progress periodically
  223.           logPeriod: 500        // number of iterations between logging
  224.         })*/
  225.         //net = makeNet(networkSettings, dataset)
  226.         trainNetwork(dataset, networkSettings, 10)
  227.         //var json = net.toJSON();
  228.  
  229.         //net = net.fromJSON(json);
  230.        
  231.         //console.log(result);
  232.         //setTimeout(function(){bot.say("NickServ", "identify "+password);}, 5000);
  233. }
  234.  
  235. function load(){
  236.         fs.readFile("C:\\Users\\Daniel\\Documents\\Programming\\AMAbotData.txt", "utf8", function (err,data) {
  237.           if (err) {
  238.                 return console.log(err);
  239.           }
  240.           rawDataset = JSON.parse(data);
  241.           console.log("loadedData")
  242.           test();
  243.         });
  244. }
  245.  
  246. function arraysEqual(arr1, arr2) {
  247.     if(arr1.length !== arr2.length)
  248.         return false;
  249.     for(var i = arr1.length; i--;) {
  250.         if(arr1[i] !== arr2[i])
  251.             return false;
  252.     }
  253.  
  254.     return true;
  255. }
  256.  
  257. var tokenizer = new natural.TreebankWordTokenizer();
  258. var NGrams = natural.NGrams;
  259. function tokenize(text){
  260.         return tokenizer.tokenize(text.toLowerCase())
  261. }
  262.  
  263. function matchMarkov(search, text, n){
  264.         var search = tokenize(search);
  265.         var text = tokenize(text);
  266.         var searchgrams = NGrams.ngrams(search, n);
  267.         var textgrams = NGrams.ngrams(text, n);
  268.         var count = 0;
  269. for (textgramNum in textgrams){
  270.                 for (searchgramNum in searchgrams){
  271.                         if (arraysEqual(searchgrams[searchgramNum], textgrams[textgramNum])){
  272.                                 count += 1;
  273.                         }
  274.                 }
  275.         }
  276.         return count;
  277. }
  278.  
  279. function matchMarkovPercent(search, text, n){
  280.         var search = tokenize(search);
  281.         var text = tokenize(text);
  282.         var searchgrams = NGrams.ngrams(search, n);
  283.         var textgrams = NGrams.ngrams(text, n);
  284.         var count = 0;
  285.         for (searchgramNum in searchgrams){
  286.                 for (textgramNum in textgrams){
  287.                         if (arraysEqual(searchgrams[searchgramNum], textgrams[textgramNum])){
  288.                                 count += 1;
  289.                                 break;
  290.                         }
  291.                 }
  292.         }
  293.         return (searchgrams.length > 0 ? count/searchgrams.length : 0);
  294. }
  295.  
  296. function numwords(text){
  297.         return tokenize(text).length;
  298. }
  299.  
  300. function segmentMatches(search, text, n){
  301.         search = search.toLowerCase()
  302.         text = text.toLowerCase()
  303.         for (i=0;i<n;i++){
  304.                 var rand1 = Math.round(Math.random()*search.length-1);
  305.                 var rand2 = Math.round(Math.random()*search.length-1);
  306.                 if (rand1 > rand2){
  307.                         text.indexOf(search.splice(rand1, search.length));
  308.                 } else {
  309.                        
  310.                 }
  311.         }
  312. }
  313.  
  314. function wordMatches(words, text){
  315.         words = words.toLowerCase();
  316.         text = text.toLowerCase();
  317.         wordsArray = words.split(" ");
  318.         textArray = text.split(" ");
  319.         wordsArray = wordsArray.filter(function(elem, pos) {
  320.                 return wordsArray.indexOf(elem) == pos;
  321.         })
  322.         var count = 0;
  323.         for (k in wordsArray){
  324.                 for(var i = 0; i < textArray.length; ++i){
  325.                         if(textArray[i] == wordsArray[k])
  326.                                 count++;
  327.                 }
  328.         }
  329.         return count
  330. }
  331.  
  332. function wordMatchesPercent(words, text){
  333.         words = words.toLowerCase();
  334.         text = text.toLowerCase();
  335.         wordsArray = words.split(" ");
  336.         textArray = text.split(" ");
  337.         wordsArray = wordsArray.filter(function(elem, pos) {
  338.                 return wordsArray.indexOf(elem) == pos;
  339.         })
  340.         var count = 0;
  341.         for (k in wordsArray){
  342.                 for(var i = 0; i < textArray.length; ++i){
  343.                         if(textArray[i] == wordsArray[k])
  344.                                 count++;
  345.                 }
  346.         }
  347.         return (textArray.length > 0 ? count/textArray.length : 0)
  348. }
  349.  
  350. function sigmoid(t) {
  351.     return 1/(1+Math.pow(Math.E, -t));
  352. }
  353.  
  354. function scale(n, max){
  355.         return (n > max ? 1 : (n < 0 ? 0 : n/max));
  356. }
  357.  
  358. function getInput(rawExample){
  359.         var example = rawExample.thread;
  360.         var question = rawExample.question;
  361.         var featureVector = {
  362.                 totalResults: (rawExample.totalResults ? rawExample.totalResults : 0),
  363.                 resultsRecorded: (rawExample.totalResults ? 1 : 0),
  364.                 /*isFirst: (rawExample.threadNum == 0 ? 1 : 0),
  365.                 firstAnswers: 1-scale(rawExample.threadNum, 7),*/
  366.                 noComments: (example.num_comments == 0 ? 1 : 0),
  367.                 manyComments: scale(example.num_comments, 5),
  368.                 searchRank: 1-rawExample.threadNum/100,
  369.                 score: scale(example.score, 3000),
  370.                 /*downs: scale(example.downs, 3000),
  371.                 ups: scale(example.ups, 3000),
  372.                 edited: (example.edited ? 1 : 0),*/
  373.                 is_self: (example.is_self ? 1 : 0),
  374.                 comments: scale(example.num_comments,20000),
  375.                 over_18: (example.over_18 ? 1 : 0),
  376.                 questionLength: scale(numwords(question),200/5),
  377.                 selfTextLength: scale(numwords(example.selftext),10000/5),
  378.                 titleLength: scale(numwords(example.title), 300/5),
  379.                 Title1gramMatches: matchMarkovPercent(question, example.title, 1),
  380.                 Title2gramMatches: matchMarkovPercent(question, example.title, 2),
  381.                 Title3gramMatches: matchMarkovPercent(question, example.title, 3),
  382.                 Self1gramMatches: matchMarkovPercent(question, example.selftext, 1),
  383.                 Self2gramMatches: matchMarkovPercent(question, example.selftext, 2),
  384.                 Self3gramMatches: matchMarkovPercent(question, example.selftext, 3),
  385.                 /*titleWordMatches: scale(wordMatches(question, example.title), 15),
  386.                 selfTextWordMatches: scale(wordMatches(question, example.selftext),30),
  387.                 titleWordMatchesPercent: wordMatchesPercent(question, example.title),
  388.                 selfTextWordMatchesPercent: wordMatchesPercent(question, example.selftext)*/
  389.         };
  390.         return featureVector;
  391. }
  392.  
  393. //extract features
  394. function extract(rawDataset){
  395.         var dataset = [];
  396.         for (k in rawDataset){
  397.                 var example = rawDataset[k].thread;
  398.                 if ("label" in rawDataset[k]){
  399.                         var question = rawDataset[k].question;
  400.                         var featureVector = getInput(rawDataset[k]);
  401.                                 var trainExample = {input: featureVector, output: (rawDataset[k].label == "positive" ? [1] : [0])};
  402.                         dataset.push(trainExample);
  403.                 }
  404.         }
  405.         console.log("Done extracting.");
  406.         return dataset;
  407. }
  408.  
  409. function save(data, filename){
  410.         fs.writeFile(filename, data, function(err) {
  411.     if(err) {
  412.         console.log(err);
  413.     } else {
  414.         console.log("The file was saved!");
  415.     }
  416. });
  417. }
  418.  
  419. // Get the lib
  420. var irc = require("irc");
  421.  
  422. // Create the bot name
  423. var bot = new irc.Client(config.server, config.botName, {
  424.         channels: config.channels,
  425.         sasl: config.sasl,
  426.         secure: config.secure,
  427.         userName: config.botName,
  428.         nick: config.botName,
  429.         password: config.password
  430. });
  431.  
  432. function getCommand(text){
  433.         if (text.indexOf("!") == 0){
  434.                 if (text.indexOf(" ") > 0){
  435.                         return [text.slice(1, text.indexOf(" ")), text.slice(text.indexOf(" ")+1, text.length)];
  436.                 } else {
  437.                         return [text.slice(1, text.length), ""];
  438.                 }
  439.         } else {
  440.                 return ["", text];
  441.         }
  442. }
  443.  
  444. function answer(to, question, from){
  445.         console.log("answering")
  446.         var callback1 = function(output, threadDat, threadNum, commentDat, commentNum, totalResults, prob){
  447.                 if (threadDat){
  448.                         rawDataset.push({question: question, thread: threadDat, comment: commentDat, threadNum: threadNum, commentNum: commentNum, totalResults: totalResults});
  449.                         if (!commentDat){
  450.                                 rawDataset[rawDataset.length-1].label = "negative";
  451.                         }
  452.                         if (!(to in activeChannels)){
  453.                                 activeChannels[to] = {};
  454.                                 //console.log("adding " + to + " to active channels");
  455.                         }
  456.                         activeChannels[to].last = rawDataset.length-1;
  457.                         //console.log("Changing " + to + ".last to " + (rawDataset.length-1));
  458.                         //console.log(JSON.stringify(activeChannels));
  459.                         activeChannels[to].details = {Title: threadDat.title, Link: "http://www.reddit.com"+threadDat.permalink, SearchResultNumber: threadNum+1, CommentNumber: commentNum+1, TotalResults: totalResults, EstimatedProbability: prob};
  460.                         //console.log(JSON.stringify(activeChannels));
  461.                         //console.log("Changing " + to + ".details to " + activeChannels[to].details);
  462.                 }
  463.                 bot.say(to, from+": "+output);
  464.         }
  465.         if (released < 2000){
  466.                 getSearch(question, subredditList, callback1);
  467.         } else {
  468.                 setTimeout(function(){answer(to, question, from);}, released+10);
  469.         }
  470. }
  471.  
  472. // Listen for any message
  473. bot.addListener("message", function(from, to, text, message) {
  474.         //detect command and splice command
  475.         var commandCut = getCommand(text);
  476.         var command = commandCut[0];
  477.         var text = commandCut[1];
  478.         text = text.replace(/\bu\b/gi, "you");
  479.         text = text.replace(/\bur\b/gi, "your");
  480.         text = text.replace(/\by\b/gi, "why");
  481.         text = text.replace(/\br u\b/gi, "are you");
  482.         text = text.replace(/\bu r\b/gi, "you are");
  483.         text = text.replace(/\b:\b/gi, " ");
  484.         text = text.replace(/\bamabot\b/gi, "");
  485.         console.log(command, text);
  486.         if (to == config.botName){
  487.                 var replyTo = from;
  488.         } else {
  489.                 var replyTo = to;
  490.         }
  491.         if (command == "boobs"){
  492.                 bot.say(replyTo, "(.Y.)");
  493.         }
  494.         if (command == "hillclimb"){
  495.                 bot.say(replyTo, "Climbing hills!...");
  496.                 var gens = 20;
  497.                 if (text){
  498.                         var vals = JSON.parse("["+text+"]");
  499.                         if (vals[0]) {
  500.                                 gens = vals[0];
  501.                         }
  502.                 } else {
  503.                         var vals  = []
  504.                 }
  505.                 var callback = function(){bot.say(replyTo, JSON.stringify(networkSettings));};
  506.                                 //rawDataset, percentValidation, gens, mutationRate, callback, timeinterval, maxtime
  507.                 hillClimb(rawDataset, 0.3, gens, 0.5, callback, (vals[1] ? vals[1]*1000 : 0), (vals[2] ? vals[2] : 60))
  508.         }
  509.         //if (command == "review")
  510.                
  511.         //
  512.         if (command == "say"){
  513.                 var txt = text.split(" ");
  514.                 bot.say(txt[0], txt.splice(1,text.length).join(" "))
  515.         }
  516.         if (command == "results"){
  517.                 if (replyTo in activeChannels && "details" in activeChannels[replyTo]){
  518.                         bot.say(replyTo, "Picked " + activeChannels[replyTo].details.SearchResultNumber.toString() + " of " + activeChannels[replyTo].details.TotalResults.toString() + " results.");
  519.                 }
  520.         }
  521.         if (command == "prob"){
  522.                 if (replyTo in activeChannels && "details" in activeChannels[replyTo]){
  523.                         bot.say(replyTo, "Estimated Probability: " + (activeChannels[replyTo].details.EstimatedProbability *100).toString().slice(0, 5) + "%");
  524.                 }
  525.         }
  526.         if (command == "title"){
  527.                 if (replyTo in activeChannels && "details" in activeChannels[replyTo]){
  528.                         bot.say(replyTo, activeChannels[replyTo].details.Title);
  529.                 }
  530.         }
  531.         if (command == "link"){
  532.                 if (replyTo in activeChannels && "details" in activeChannels[replyTo]){
  533.                         bot.say(replyTo, activeChannels[replyTo].details.Link);
  534.                 }
  535.         }
  536.         if (command == "KickTheBucket"){
  537.                 bot.say(replyTo, "/me kicks pail.");
  538.         }
  539.         if (command == "train"){
  540.                 if (text.length > 0){
  541.                         var value = JSON.parse("["+text+"]");
  542.                         networkSettings.layers = value[0];
  543.                         networkSettings.learningRate = (value[1] ? value[1] : networkSettings.learningRate);
  544.                         networkSettings.threshold = (value[2] ? value[2] : networkSettings.threshold);
  545.                         /*net = new brain.NeuralNetwork({
  546.                                 hiddenLayers: values[0],
  547.                                 learningRate: (values[1] ? values[1] : 0.3)
  548.                         })*/;}
  549.                 var dataset = extract(rawDataset);
  550.                 result = trainNetwork(dataset, networkSettings, 10)
  551.                 //net = makeNet(networkSettings, dataset);
  552.                 //var result = net.train(dataset, {
  553.                 //  errorThresh: networkSettings.threshold,  // error threshold to reach
  554.                 //  iterations: networkSettings.iterations,   // maximum training iterations
  555.                 //  log: true,           // console.log() progress periodically
  556.                 //  logPeriod: 5000        // number of iterations between logging
  557.                 //})
  558.                 bot.say(replyTo, JSON.stringify(result));
  559.                 //bot.say(replyTo, "Trained");
  560.         }
  561.         if (command == "details"){
  562.                 console.log("This part is working, command details recognized.")
  563.                 //console.log(JSON.stringify(activeChannels));
  564.                 if (replyTo in activeChannels && "details" in activeChannels[replyTo]){
  565.                         bot.say(replyTo, JSON.stringify(activeChannels[replyTo].details));
  566.                 }
  567.         }
  568.         if (command == 'ShowMeYourBrain'){
  569.                 bot.say(replyTo, JSON.stringify(net.toJSON()));
  570.         }
  571.         if (command == "login"){
  572.                 bot.say("NickServ", "nick AMAbot");
  573.                 setTimeout(function(){bot.say("NickServ", "identify "+password);}, 5000);
  574.         }
  575.         if (command == "save"){
  576.                 console.log("saving...");
  577.                 bot.say(replyTo, "Saving...")
  578.                 save(JSON.stringify(rawDataset), "C:\\Users\\Daniel\\Documents\\Programming\\AMAbotData.txt");
  579.         }
  580.         if (command == "yes" || command == "no"){
  581.                 if (replyTo in activeChannels && "last" in activeChannels[replyTo]){
  582.                         rawDataset[activeChannels[replyTo].last].label = (command == "yes" ? "positive" : "negative")
  583.                 }
  584.         } else if (to == config.botName && from != config.botName && command == ""){
  585.                 console.log(from, command, text);
  586.                 answer(from, text);
  587.         } else if (command == "ask"){
  588.                 console.log(from, command, text);
  589.                 answer(replyTo, text, from);
  590.         } else if (command == "dumpData"){
  591.                 rawDataset = [];
  592.         } else if (to == "#mybots" && command == ""){
  593.                 console.log(from, command, text);
  594.                 answer(replyTo, text, from);
  595.         }
  596. });
  597.  
  598. function getSearch(question, subreddits, callback1){
  599.         question2 = encodeURIComponent(question);
  600.         var options = {
  601.           host: 'www.reddit.com',
  602.           path: '/r/'+subreddits[0]+'/search.json?q=' + question2 + '&restrict_sr=on&sort=relevance&t=all&limit=100',
  603.           headers: {'user-agent': '/u/Noncomment IRC bot \'AMAbot\'; #futurology, #bottest'}
  604.         };
  605.  
  606.         callback = function(response) {
  607.           var str = '';
  608.  
  609.           //another chunk of data has been recieved, so append it to `str`
  610.           response.on('data', function (chunk) {
  611.                 str += chunk;
  612.           });
  613.  
  614.           //the whole response has been recieved
  615.           response.on('end', function () {
  616.                 var errorVar = true
  617.                 try {
  618.                 var search = JSON.parse(str);
  619.                 if (!search.data){Error()};
  620.                 } catch(err) {
  621.                         setTimeout(function(){getSearch(question, subreddits, callback1);}, 2000);
  622.                         errorVar = false
  623.                 }
  624.                 if (errorVar) {
  625.                 if (search.data.children.length < 1){
  626.                         if (subreddits.length>1){
  627.                                 subreddits = subreddits.slice(1, subreddits.length);
  628.                                 setTimeout(function(){getSearch(question, subreddits, callback1);}, 50);
  629.                         } else {
  630.                                 callback1("Sorry I don't know.", false, 0, false, 0, 0, 0);
  631.                         }
  632.                 } else {
  633.                         var children = search.data.children;
  634.                         var best = 0;
  635.                         var bestNum = 0;
  636.                         var bestThread = children[0].data;
  637.                         var bestDat;
  638.                         for (num=0;num<children.length;num++){
  639.                                 var threadDat = children[num].data;
  640.                                 var example = {question: question, thread: threadDat, threadNum: num};
  641.                                 var test = getInput(example);
  642.                                 var prob = net.run(test)[0];
  643.                                 console.log(num, prob);
  644.                                 if (prob > best){
  645.                                         best = prob;
  646.                                         bestNum = num;
  647.                                         bestThread = threadDat;
  648.                                         bestDat = test;
  649.                                 }
  650.                         }
  651.                         console.log(bestDat);
  652.                         console.log("Picking: ", bestNum, best);
  653.                         setTimeout(function(){getComment(bestThread.permalink, callback1, bestThread, bestNum, children.length, best);}, 50);
  654.                 }}
  655.           });
  656.         }
  657.         released += 2000;
  658.         setTimeout(function(){released += -2000;}, 2000);
  659.         http.request(options, callback).end();
  660. }
  661.  
  662. function getComment(permalink, callback1, threadDat, threadNum, totalResults, prob){
  663.         permalink = permalink.replace('?ref=search_posts', '')
  664.         console.log(permalink)
  665.         var options = {
  666.           host: 'www.reddit.com',
  667.           path: permalink + ".json",
  668.           headers: {'user-agent': '/u/Noncomment IRC bot \'AMAbot\'; #futurology, #bottest'}
  669.         };
  670.  
  671.         callback = function(response) {
  672.           var str = '';
  673.  
  674.           //another chunk of data has been recieved, so append it to `str`
  675.           response.on('data', function (chunk) {
  676.                 str += chunk;
  677.           });
  678.  
  679.           //the whole response has been recieved
  680.           response.on('end', function () {
  681.                 var errorVar = true
  682.                 try {
  683.                 var search = JSON.parse(str);
  684.                 if (!search.data){Error()};
  685.                 } catch(err) {
  686.                         setTimeout(function(){getComment(permalink, callback1, threadDat, threadNum, totalResults, prob);}, 2000);
  687.                         errorVar = false
  688.                 }
  689.                 if (errorVar) {
  690.                 var i = 0;
  691.                 var comments = search[1].data.children;
  692.                 while (i<comments.length){
  693.                         var comment = comments[i].data.body;
  694.                         console.log(comment);
  695.                         var completed = false
  696.                         if (!(comment == "[deleted]") && comment.length < maxLength && (comment.split("\n").length - 1) < maxNewlines){
  697.                                 commentDat = comments[i].data;
  698.                                 callback1(comment, threadDat, threadNum, commentDat, i, totalResults, prob);
  699.                                 completed = true;
  700.                                 break;
  701.                         }
  702.                         i++
  703.                 }
  704.                 if (!completed){
  705.                         callback1("Sorry this knowledge is forbidden.", threadDat, threadNum, false, 0, totalResults, prob)
  706.                 }}
  707.           });
  708.         }
  709.         released += 2000;
  710.         setTimeout(function(){released += -2000;}, 2000);
  711.         http.request(options, callback).end();
  712. }
  713. load()
RAW Paste Data
We use cookies for various purposes including analytics. By continuing to use Pastebin, you agree to our use of cookies as described in the Cookies Policy. OK, I Understand
Top