]> jfr.im git - irc/gameservirc.git/blame - gameserv/news.cpp
Added news command
[irc/gameservirc.git] / gameserv / news.cpp
CommitLineData
c260a8d7 1#include "extern.h"
466692a5 2#include <fstream>
3
4using std::ofstream;
5using std::ifstream;
c260a8d7 6
7List<myString> todaysnews;
8void addNews(List<myString> &news, const char *fmt, ...);
9void showNews(char *nick, List<myString> &news);
466692a5 10void saveNews(char *filename, List<myString> &news);
11void loadNews(char *filename, List<myString> &news);
c260a8d7 12
13void addNews(List<myString> &news, const char *fmt, ...)
14{
15 if (fmt[0] == '\0')
16 return;
17
174e7f8f 18 log("Adding news item: fmt = %s", fmt);
19
c260a8d7 20 va_list args;
21 char *input;
22 input = new char[1024];
174e7f8f 23 memset(input, 0, 1024);
c260a8d7 24 const char *t = fmt;
25
26 va_start(args, fmt);
27
28 for (; *t; t++)
29 {
30 if (*t == '%')
31 {
32 switch(*++t) {
33 case 'd': sprintf(input, "%s%d", input, va_arg(args, int)); break;
34 case 's': sprintf(input, "%s%s", input, va_arg(args, char *)); break;
35 case 'S': sprintf(input, "%s%s", input, s_GameServ); break;
36 case 'l':
37 if (*++t == 'd')
38 sprintf(input, "%s%ld", input, va_arg(args, long int)); break;
39 }
40 }
41 else
42 {
43 sprintf(input, "%s%c", input, *t);
44 }
45
46 }
47 #ifdef DEBUGMODE
48 log("New News Item: %s", input);
49 #endif
174e7f8f 50
c260a8d7 51 myString *nstring;
52 nstring = new myString(input);
53 news.insertAtBack(nstring);
54
55 delete [] input;
56 delete nstring;
57
58va_end(args);
59}
60
61void showNews(char *nick, List<myString> &news)
62{
63 if (!news.isEmpty())
64 {
65 ListNode<myString> *it;
66 it = news.First();
67
68 notice(s_GameServ, nick, "The Daily Happenings: ");
69 while (it)
70 {
71 notice(s_GameServ, nick, "%s", it->getData()->getString());
72 it = it->Next();
73 }
74 notice(s_GameServ, nick, "End of News");
75 }
76}
466692a5 77
78void saveNews(char *filename, List<myString> &news)
79{
80 if (news.isEmpty())
81 return;
82
83 ofstream outfile;
84 outfile.open(filename);
85 if (outfile.fail())
86 {
87 log("Error opening %s", filename);
88 return;
89 }
90
91 ListNode<myString> *it;
92 it = news.First();
93 while (it)
94 {
95 outfile << it->getData()->getString() << endl;
96 it = it->Next();
97 }
98 outfile.close();
99}
100
101void loadNews(char *filename, List<myString> &news)
102{
103 if (news.isEmpty())
104 return;
105
106 // First clear the old news out
107 ListNode<myString> *it, *temp;
108 it = news.First();
109
110 while (it)
111 {
112 temp = it;
113 it = it->Next();
114 delete temp;
115 }
116
117 // Now load from the file
118 ifstream infile;
119 infile.open(filename);
120 if (infile.fail())
121 {
122 log("Error opening %s", filename);
123 return;
124 }
125
126 char *buf;
127 myString *string;
128 buf = new char [1024];
129
130 while (infile.getline(buf, 1024, '\n'))
131 {
132 string = new myString(buf);
133 news.insertAtBack(string);
134 delete string;
135 }
136
137 delete [] buf;
138}