]>
Commit | Line | Data |
---|---|---|
b9179170 MV |
1 | // -*- mode: cpp; mode: fold -*- |
2 | // Description /*{{{*/ | |
3 | /* ###################################################################### | |
4 | ||
5 | Here be cows – but: Never ask, never tell | |
6 | ||
7 | ##################################################################### */ | |
8 | /*}}}*/ | |
9 | // Include Files /*{{{*/ | |
10 | #include<config.h> | |
11 | ||
12 | #include <apt-pkg/configuration.h> | |
13 | #include <apt-pkg/cmndline.h> | |
14 | #include <apt-pkg/strutl.h> | |
15 | ||
16 | #include <strings.h> | |
17 | #include <sstream> | |
18 | ||
19 | #include "private-moo.h" | |
20 | #include "private-output.h" | |
21 | ||
22 | #include <apti18n.h> | |
23 | /*}}}*/ | |
24 | ||
c3ccac92 | 25 | static std::string getMooLine() { /*{{{*/ |
b9179170 MV |
26 | time_t const timenow = time(NULL); |
27 | struct tm special; | |
28 | localtime_r(&timenow, &special); | |
29 | enum { NORMAL, PACKAGEMANAGER, APPRECIATION, AGITATION, AIRBORN } line; | |
30 | if (special.tm_mon == 11 && special.tm_mday == 25) | |
31 | line = PACKAGEMANAGER; | |
32 | else if (special.tm_mon == 7 && special.tm_mday == 16) | |
33 | line = APPRECIATION; | |
34 | else if (special.tm_mon == 10 && special.tm_mday == 7) | |
35 | line = AGITATION; | |
36 | else if (special.tm_mon == 1 && special.tm_mday == 18) | |
37 | line = AIRBORN; | |
38 | else | |
39 | line = NORMAL; | |
40 | ||
41 | bool const quiet = _config->FindI("quiet") >= 2; | |
42 | std::ostringstream out; | |
43 | if (quiet == false) | |
44 | out << "...\""; | |
45 | ||
46 | switch(line) | |
47 | { | |
48 | case PACKAGEMANAGER: out << "Happy package management day!"; break; | |
49 | case APPRECIATION: out << "Three moos for Debian!"; break; | |
50 | case AGITATION: out << "Whoever needs milk, bows to the animal."; break; | |
51 | case AIRBORN: out << "It's a Bird ... It's a Plane ... It's Super Cow!"; break; | |
52 | default: out << "Have you mooed today?"; break; | |
53 | } | |
54 | ||
55 | if (quiet == true) | |
56 | out << std::endl; | |
57 | else | |
58 | out << "\"..." << std::endl; | |
59 | ||
60 | return out.str(); | |
61 | } | |
62 | /*}}}*/ | |
c3ccac92 | 63 | static bool printMooLine() { /*{{{*/ |
b9179170 MV |
64 | std::cerr << getMooLine() << std::endl; |
65 | return true; | |
66 | } | |
67 | /*}}}*/ | |
68 | bool DoMoo1(CommandLine &CmdL) /*{{{*/ | |
69 | { | |
70 | // our trustworthy super cow since 2001 | |
71 | if (_config->FindI("quiet") >= 2) | |
72 | return printMooLine(); | |
73 | std::string const moo = getMooLine(); | |
74 | size_t const depth = moo.length()/4; | |
75 | c1out << | |
76 | OutputInDepth(depth, " ") << " (__) \n" << | |
77 | OutputInDepth(depth, " ") << " (oo) \n" << | |
78 | OutputInDepth(depth, " ") << " /------\\/ \n" << | |
79 | OutputInDepth(depth, " ") << " / | || \n" << | |
80 | OutputInDepth(depth, " ") << " * /\\---/\\ \n" << | |
81 | OutputInDepth(depth, " ") << " ~~ ~~ \n" << | |
82 | moo; | |
83 | return true; | |
84 | } | |
85 | /*}}}*/ | |
86 | bool DoMoo2(CommandLine &CmdL) /*{{{*/ | |
87 | { | |
88 | // by Fernando Ribeiro in lp:56125 | |
89 | if (_config->FindI("quiet") >= 2) | |
90 | return printMooLine(); | |
91 | std::string const moo = getMooLine(); | |
92 | size_t const depth = moo.length()/4; | |
93 | if (_config->FindB("APT::Moo::Color", false) == false) | |
94 | c1out << | |
95 | OutputInDepth(depth, " ") << " (__) \n" << | |
96 | OutputInDepth(depth, " ") << " _______~(..)~ \n" << | |
97 | OutputInDepth(depth, " ") << " ,----\\(oo) \n" << | |
98 | OutputInDepth(depth, " ") << " /|____|,' \n" << | |
99 | OutputInDepth(depth, " ") << " * /\"\\ /\\ \n" << | |
100 | OutputInDepth(depth, " ") << " ~ ~ ~ ~ \n" << | |
101 | moo; | |
102 | else | |
103 | { | |
104 | c1out << | |
27511c01 DK |
105 | OutputInDepth(depth, " ") << " \033[1;97m(\033[0;33m__\033[1;97m)\033[0m\n" << |
106 | OutputInDepth(depth, " ") << " \033[31m_______\033[33m~(\033[1;34m..\033[0;33m)~\033[0m\n" << | |
107 | OutputInDepth(depth, " ") << " \033[33m,----\033[31m\\\033[33m(\033[1;4;35moo\033[0;33m)\033[0m\n" << | |
108 | OutputInDepth(depth, " ") << " \033[33m/|____|,'\033[0m\n" << | |
109 | OutputInDepth(depth, " ") << " \033[1;5;97m*\033[0;33m /\\ /\\\033[0m\n" << | |
110 | "\033[32m"; | |
b9179170 MV |
111 | for (size_t i = moo.length()/2; i > 1; --i) |
112 | c1out << "wW"; | |
113 | ||
27511c01 | 114 | c1out << "w\033[0m\n" << moo; |
b9179170 MV |
115 | } |
116 | ||
117 | return true; | |
118 | } | |
119 | /*}}}*/ | |
120 | bool DoMoo3(CommandLine &CmdL) /*{{{*/ | |
121 | { | |
122 | // by Robert Millan in deb:134156 | |
123 | if (_config->FindI("quiet") >= 2) | |
124 | return printMooLine(); | |
125 | std::string const moo = getMooLine(); | |
126 | size_t const depth = moo.length()/16; | |
127 | c1out << | |
128 | OutputInDepth(depth, " ") << " \\_/ \n" << | |
129 | OutputInDepth(depth, " ") << " m00h (__) -(_)- \n" << | |
130 | OutputInDepth(depth, " ") << " \\ ~Oo~___ / \\\n" << | |
131 | OutputInDepth(depth, " ") << " (..) |\\ \n" << | |
132 | OutputInDepth(depth, "_") << "_________|_|_|__________" << | |
133 | OutputInDepth((moo.length() - (depth + 27)), "_") << "\n" << moo; | |
134 | return true; | |
135 | } | |
136 | /*}}}*/ | |
137 | bool DoMooApril(CommandLine &CmdL) /*{{{*/ | |
138 | { | |
139 | // by Christopher Allan Webber and proposed by Paul Tagliamonte | |
140 | // in a "Community outreach": https://lists.debian.org/debian-devel/2013/04/msg00045.html | |
141 | if (_config->FindI("quiet") >= 2) | |
142 | { | |
143 | std::cerr << "Have you smashed some milk today?" << std::endl; | |
144 | return true; | |
145 | } | |
146 | c1out << | |
147 | " _ _\n" | |
148 | " (_\\___( \\,\n" | |
149 | " )___ _ Have you smashed some milk today?\n" | |
150 | " /( (_)-(_) /\n" | |
151 | " ,---------' \\_\n" | |
152 | " //( ',__,' \\ (' ')\n" | |
153 | " // ) '----'\n" | |
154 | " '' ; \\ .--. ,/\n" | |
155 | " | )',_,'----( ;\n" | |
156 | " ||| ''' '||\n"; | |
157 | return true; | |
158 | } | |
159 | /*}}}*/ | |
160 | bool DoMoo(CommandLine &CmdL) /*{{{*/ | |
161 | { | |
162 | time_t const timenow = time(NULL); | |
163 | struct tm april; | |
164 | localtime_r(&timenow, &april); | |
165 | if (april.tm_mday == 1 && april.tm_mon == 3) | |
166 | return DoMooApril(CmdL); | |
167 | ||
168 | signed short SuperCow = 1; | |
169 | if (CmdL.FileSize() != 0) | |
170 | for (const char **Moo = CmdL.FileList + 1; *Moo != 0; Moo++) | |
171 | if (strcasecmp(*Moo, "moo") == 0) | |
172 | SuperCow++; | |
173 | ||
174 | // time is random enough for our purpose | |
175 | if (SuperCow > 3) | |
176 | { | |
177 | if (april.tm_sec == 1) | |
178 | SuperCow = 1 + (timenow % 4); | |
179 | else | |
180 | SuperCow = 1 + (timenow % 3); | |
181 | } | |
182 | ||
183 | switch(SuperCow) { | |
184 | case 1: return DoMoo1(CmdL); | |
185 | case 2: return DoMoo2(CmdL); | |
186 | case 3: return DoMoo3(CmdL); | |
187 | case 4: return DoMooApril(CmdL); | |
188 | default: return DoMoo1(CmdL); | |
189 | } | |
190 | ||
191 | return true; | |
192 | } | |
193 | /*}}}*/ |