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