Advertisement
Houshalter

AMAbot Code

Jul 11th, 2015
1,101
0
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()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement