]> jfr.im git - irc/gameservirc.git/blob - gameserv/news.cpp
Fixed a problem with the addnews function
[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 showNews(char *nick, List<myString> &news);
10 void saveNews(char *filename, List<myString> &news);
11 void loadNews(char *filename, List<myString> &news);
12
13 void addNews(List<myString> &news, const char *fmt, ...)
14 {
15 if (fmt[0] == '\0')
16 return;
17
18 log("Adding news item: fmt = %s", fmt);
19
20 va_list args;
21 char *input;
22 input = new char[1024];
23 memset(input, 0, 1024);
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
50
51 myString *nstring;
52 nstring = new myString(input);
53 news.insertAtBack(nstring);
54
55 delete [] input;
56 delete nstring;
57
58 va_end(args);
59 }
60
61 void 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 }
77
78 void 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
101 void 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 }