summary refs log tree commit diff stats
path: root/dialogue.cpp
diff options
context:
space:
mode:
authorKelly Rauchenberger <fefferburbia@gmail.com>2019-02-28 20:28:20 -0500
committerKelly Rauchenberger <fefferburbia@gmail.com>2019-02-28 20:28:20 -0500
commitd7e934156858287cdb7597ad0dced97d4d279f2f (patch)
treee1822649bb449d972839bb5c8adfd6b1c51d652c /dialogue.cpp
parentb85830e8a852392036a803b7f6bb417c28ff17c4 (diff)
downloadaspartame-d7e934156858287cdb7597ad0dced97d4d279f2f.tar.gz
aspartame-d7e934156858287cdb7597ad0dced97d4d279f2f.tar.bz2
aspartame-d7e934156858287cdb7597ad0dced97d4d279f2f.zip
Got it bot-ready!
Using C++ randomization now, along with an update to rawr-ebooks that allows it to do the same. Cleaned up the code here and there. Added in the twitter client and the config file reader. We can use librawr's histogram class now, so we don't need our own. Also why did we not name this bot "aspartame". It's a Sugar replacer. Hahaha. I'm Pink Diamond.
Diffstat (limited to 'dialogue.cpp')
-rw-r--r--dialogue.cpp66
1 files changed, 47 insertions, 19 deletions
diff --git a/dialogue.cpp b/dialogue.cpp index 47a761d..1e95d2b 100644 --- a/dialogue.cpp +++ b/dialogue.cpp
@@ -2,19 +2,17 @@
2#include "identifier.h" 2#include "identifier.h"
3#include "histogram.h" 3#include "histogram.h"
4#include <rawr.h> 4#include <rawr.h>
5#include <cstdlib>
6#include <ctime>
7#include <map> 5#include <map>
8#include <string> 6#include <string>
9#include <iostream> 7#include <iostream>
10#include <sstream> 8#include <sstream>
11 9#include <random>
12 10#include <twitter.h>
11#include <yaml-cpp/yaml.h>
13 12
14using speakerstore = identifier<std::string>; 13using speakerstore = identifier<std::string>;
15using speaker_id = speakerstore::key_type; 14using speaker_id = speakerstore::key_type;
16 15
17
18struct speaker_data { 16struct speaker_data {
19 17
20 std::string name; 18 std::string name;
@@ -24,21 +22,39 @@ struct speaker_data {
24 22
25}; 23};
26 24
25int main(int argc, char** argv)
26{
27 if (argc != 2)
28 {
29 std::cout << "usage: garnet [configfile]" << std::endl;
30 return -1;
31 }
32
33 std::random_device randomDevice;
34 std::mt19937 rng(randomDevice());
27 35
36 std::string configfile(argv[1]);
37 YAML::Node config = YAML::LoadFile(configfile);
28 38
39 twitter::auth auth(
40 config["consumer_key"].as<std::string>(),
41 config["consumer_secret"].as<std::string>(),
42 config["access_key"].as<std::string>(),
43 config["access_secret"].as<std::string>());
29 44
30int main(int, char**) 45 twitter::client client(auth);
31{
32 srand(time(NULL));
33 rand(); rand(); rand(); rand();
34 46
35 speakerstore speakers; 47 speakerstore speakers;
36 std::map<speaker_id, speaker_data> speakerData; 48 std::map<speaker_id, speaker_data> speakerData;
37 histogram<speaker_id> allSpeakers; 49 histogram<speaker_id> allSpeakers;
38 50
51 using csv =
52 io::CSVReader<
53 2,
54 io::trim_chars<' ', '\t'>,
55 io::double_quote_escape<',', '"'>>;
39 56
40 57 csv in(config["transcript"].as<std::string>());
41 io::CSVReader<2,io::trim_chars<' ', '\t'>,io::double_quote_escape<',', '"'>> in("../dialogue.csv");
42 std::string speaker; 58 std::string speaker;
43 std::string line; 59 std::string line;
44 60
@@ -85,11 +101,10 @@ int main(int, char**)
85 { 101 {
86 std::set<speaker_id> pastSpeakers; 102 std::set<speaker_id> pastSpeakers;
87 103
88 104 speaker_id curSpeaker = allSpeakers.next(rng);
89 speaker_id curSpeaker = allSpeakers.next();
90 105
91 std::ostringstream theEnd; 106 std::ostringstream theEnd;
92 int maxLines = rand() % 4 + 3; 107 int maxLines = std::uniform_int_distribution<int>(3, 6)(rng);
93 108
94 for (int i = 0; i < maxLines; i++) 109 for (int i = 0; i < maxLines; i++)
95 { 110 {
@@ -102,7 +117,8 @@ int main(int, char**)
102 theEnd << curSd.name << ": "; 117 theEnd << curSd.name << ": ";
103 } 118 }
104 119
105 std::string curLine = curSd.chain.randomSentence(rand() % 30 + 1); 120 int maxL = std::uniform_int_distribution<int>(1, 30)(rng);
121 std::string curLine = curSd.chain.randomSentence(maxL, rng);
106 122
107 if (curSd.name == "" && 123 if (curSd.name == "" &&
108 curLine[0] != '[' && 124 curLine[0] != '[' &&
@@ -116,13 +132,16 @@ int main(int, char**)
116 132
117 theEnd << std::endl; 133 theEnd << std::endl;
118 134
119 speaker_id repeatSpeaker = *std::next(std::begin(pastSpeakers), rand() % pastSpeakers.size()); 135 int psi =
136 std::uniform_int_distribution<int>(0, pastSpeakers.size()-1)(rng);
137
138 speaker_id repeatSpeaker = *std::next(std::begin(pastSpeakers), psi);
120 if (repeatSpeaker != curSpeaker && 139 if (repeatSpeaker != curSpeaker &&
121 rand() % 3 == 0) 140 std::bernoulli_distribution(1.0 / 3.0)(rng))
122 { 141 {
123 curSpeaker = repeatSpeaker; 142 curSpeaker = repeatSpeaker;
124 } else { 143 } else {
125 curSpeaker = curSd.nextSpeaker.next(); 144 curSpeaker = curSd.nextSpeaker.next(rng);
126 } 145 }
127 } 146 }
128 147
@@ -131,9 +150,18 @@ int main(int, char**)
131 output = output.substr(0, output.find_last_of('\n')); 150 output = output.substr(0, output.find_last_of('\n'));
132 std::cout << output; 151 std::cout << output;
133 152
153 try
154 {
155 client.updateStatus(output);
156 } catch (const twitter::twitter_error& error)
157 {
158 std::cout << "Twitter error while tweeting: " << error.what()
159 << std::endl;
160 }
161
134 std::cout << std::endl; 162 std::cout << std::endl;
135 std::cout << std::endl; 163 std::cout << std::endl;
136 164
137 getc(stdin); 165 std::this_thread::sleep_for(std::chrono::hours(4));
138 } 166 }
139} 167}