diff options
Diffstat (limited to 'dialogue.cpp')
| -rw-r--r-- | dialogue.cpp | 66 |
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 | ||
| 14 | using speakerstore = identifier<std::string>; | 13 | using speakerstore = identifier<std::string>; |
| 15 | using speaker_id = speakerstore::key_type; | 14 | using speaker_id = speakerstore::key_type; |
| 16 | 15 | ||
| 17 | |||
| 18 | struct speaker_data { | 16 | struct 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 | ||
| 25 | int 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 | ||
| 30 | int 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 | } |
