blob: 9fef15c7a4c61cb3d1231167f43e8709695ce483 [file] [log] [blame]
MG Mud User88f12472016-06-24 23:31:02 +02001// MorgenGrauen MUDlib
2//
3// www.news.c -- WWW frontend for reading mud news
4//
5// $Id: www.news.c 8755 2014-04-26 13:13:40Z Zesstra $
6
7#pragma strong_types
8#pragma combine_strings
9
10#include <www.h>
Zesstra8b258db2019-12-29 15:13:00 +010011#include <news.h>
MG Mud User88f12472016-06-24 23:31:02 +020012
13#define DBG(x) tell_object(find_player("hate"), sprintf("DBG: %O\n", x))
14
15#define NEWSD "/secure/news"
16
17#define N_GROUP 0
18#define N_AUTHOR 1
19#define N_TID 2
20#define N_DATE 3
21#define N_TITLE 4
22#define N_ARTICLE 5
23
24varargs private string url(string group, string article)
25{
26 return "\""+MUDWWW+"?"+REQ+"="+R_NEWS
27 +(group?"&"+GROUP+"="+group:"")
28 +(article?"&"+ARTICLE+"="+article:"")+"\"";
29}
30
31varargs private string make_link(string text, string group, string article)
32{
33 if(!text || !sizeof(text)) text = "-Unbenannt-";
34 return "<A HREF="+url(group, article)+">"+text+"</A>";
35}
36
37string GroupList()
38{
39 string *list, ret;
40 int i, t;
41
42 list = NEWSD->GetGroups();
43 for (i = 0, ret = ""; i < sizeof(list); i++)
44 ret += sprintf("[%3d Artikel, %-6s] %s\n",
45 sizeof(NEWSD->GetNotes(list[i])),
46 dtime(t = NEWSD->GetNewsTime(list[i]))[5..11],
47 make_link(list[i],list[i]+":"+t));
48 return "<H2>&Uuml;bersicht</H2>"
49 +"<H3>["+sizeof(list)+" Gruppen, "
50 +"letzte &Auml;nderung "+dtime(NEWSD->GetNewsTime())+"]</H3>"
51 +"<PRE>" + ret +"</PRE>";
52}
53
54#define THREAD(a) ("~#! rn="+(a[N_AUTHOR])+" rt="+(a[N_DATE])+ \
55 " rg="+(a[N_GROUP]))
56#define TEXPR "rn=[^\n ]*|rt=[^\n ]*|rg=[^\n ]*"
57
58private mixed tinfo(mixed article)
59{
60 mixed tmp, info;
61 string rn, rt, rg, tid;
62 int j, k;
63
64 tmp = regexp(old_explode(article[N_ARTICLE], "\n"), "^~#!");
65 for(j = sizeof(tmp); j--;) {
66 mixed line;
67 line = old_explode(tmp[j], " ");
68 for(k = sizeof(line); k--;) {
69 if(line[k][0..1]=="rn") rn = line[k][3..];
70 if(line[k][0..1]=="rt") rt = line[k][3..];
71 if(line[k][0..1]=="rg") rg = line[k][3..];
72 if(line[k][0..2]=="tid") tid = line[k][4..];
73 }
74 }
75 if(!tid) tid = ""+article[N_DATE];
76 return ({ rn, rt, rg, tid });
77}
78
79#define RN 0
80#define RT 1
81#define RG 2
82#define TID 3
83
84private int thread(mixed article, int i, mapping t)
85{
86 mixed info;
87 info = tinfo(article);
88
89 if(info[TID]) {
90 t[info[TID]]++;
91 t[info[TID], 1] = sprintf("%3.3d [%-12s %-6s]%-3s %s\n",
92 i+1,
93 article[N_AUTHOR]+":",
94 dtime(article[N_DATE])[5..11],
95 (t[info[TID]] - 1) ? "+"+(t[info[TID]]-1) : " - ",
96 make_link(article[N_TITLE],
97 article[N_GROUP], to_string(i)))
98 + (t[info[TID], 1] ? t[info[TID], 1] : "");
99 t[info[TID], 2] = info;
100 if(article[N_DATE] > to_int(t[info[TID], 3]))
101 t[info[TID], 3] = ""+article[N_DATE];
102 return 1;
103 }
104}
105
106private int expired(mixed *list, int i)
107{
108 mixed info;
109 info = tinfo(list[i]);
110 for(i--; i >= 0; i--)
111 if(list[i][N_AUTHOR] == info[RN] &&
112 list[i][N_DATE] == to_int(info[RT]))
113 return 0;
114 return 1;
115}
116
117string ArticleList(string group)
118{
Zesstrabe894b42019-11-27 19:56:32 +0100119 string ret;
MG Mud User88f12472016-06-24 23:31:02 +0200120 mapping t;
121 int i;
122
Zesstrabe894b42019-11-27 19:56:32 +0100123 mixed list = NEWSD->GetNotes(group = old_explode(group, ":")[0]);
MG Mud User88f12472016-06-24 23:31:02 +0200124 if (!pointerp(list)) {
125 return "<H2>Gruppe: "+group+"</H2>"
126 "<H3>existiert nicht.</H3>"
127 "["+make_link("Gruppen&uuml;bersicht")+"]";
128 }
129 t = m_allocate(0,4);
130 for (i = sizeof(list)-1, ret = ""; i >= 0; i--)
Zesstra8b258db2019-12-29 15:13:00 +0100131 {
132 list[i][M_TITLE] = to_text(to_bytes(list[i][M_TITLE],"ASCII//TRANSLIT"),
133 "ASCII");
MG Mud User88f12472016-06-24 23:31:02 +0200134 if(!thread(list[i], i, t) || expired(list, i))
135 {
136 int ttmp;
137 string tid;
138 mixed tt; tt = tinfo(list[i]);
139 ttmp = t[tid = tt[TID]] - 1;
140 ret = sprintf("%3.3d [%-12s %-6s]%-3s %s\n",
141 i+1,
142 list[i][N_AUTHOR]+":",
143 dtime(list[i][N_DATE])[5..11],
144 ttmp > 0 ? "+"+ttmp : " - ",
145 make_link((string)list[i][N_TITLE]
146 +(ttmp > 0 ?
147 " ("+dtime(to_int(t[tid, 3]))[5..11]
148 +dtime(to_int(t[tid, 3]))[17..]+")" : ""),
149 group, to_string(i)+":"+t[tid, 3])) + ret;
150 }
Zesstra8b258db2019-12-29 15:13:00 +0100151 }
MG Mud User88f12472016-06-24 23:31:02 +0200152 return "<H2>Gruppe: "+group+"</H2>"
153 +"<H3>["+sizeof(list)+" Artikel, "
154 +"letzte &Auml;nderung "+dtime(NEWSD->GetNewsTime(group))+"]</H3>"
155 +"<PRE>" + ret + "</PRE>"
156 +"["+make_link("Gruppen&uuml;bersicht")+"]";
157}
158
159private varargs string Message(string group, mixed article)
160{
161 mixed text, tmp, ttmp, next, prev, info;
162 string art;
163 mapping t;
164 int i;
165
166 if (!article) article = 0;
167 else article = to_int(old_explode(article, ":")[0]);
168
169 tmp = NEWSD->GetNotes(group = old_explode(group, ":")[0]);
170 if (pointerp(tmp) && (article >= sizeof(tmp)))
171 return("Artikel nicht gefunden, soviele Artikel hat diese Rubrik "
172 "nicht!\n");
MG Mud User88f12472016-06-24 23:31:02 +0200173 text = tmp[article];
Zesstra8b258db2019-12-29 15:13:00 +0100174 text[M_TITLE] = to_text(to_bytes(text[M_TITLE], "ASCII//TRANSLIT"),"ASCII");
175 text[M_MESSAGE] = to_text(to_bytes(text[M_MESSAGE], "ASCII//TRANSLIT"),
176 "ASCII");
MG Mud User88f12472016-06-24 23:31:02 +0200177
178 t = m_allocate(0,4);
179 for(i = sizeof(tmp)-1; i > article; i--)
180 thread(tmp[i], i, t);
181 next = "N&auml;chster Artikel";
182 prev = "Voriger Artikel";
183
184 art = implode((ttmp = old_explode(text[N_ARTICLE], "\n"))
185 - regexp(ttmp, "^~#!"), "\n");
186
187 art = regreplace(art, "<", "\\&lt;", 1);
188 art = regreplace(art, ">", "\\&gt;", 1);
189 art = regreplace(art, "([a-zA-Z][a-zA-Z]*://[^ \n\t][^ \n\t]*)", "<a href=\"\\1\">\\1</a>", 1);
190
191 info = tinfo(text);
192
193 return "<H1>" + text[N_TITLE] + "</H1><HR>\n"
194 + "<H3>" + group + ": " + text[N_AUTHOR]
195 + " (Artikel " + (article + 1) + ", " + dtime(text[N_DATE]) + ")\n</H3>"
196 + (info[RN] ? ("<H4>Antwort auf "+info[RN]+
197 (expired(tmp, article) ? " (verfallen)" : "")+"</H4>")
198 : "")
199 + "<PRE>" + art + "</PRE>\n"
200 + (t[info[TID]] ?
201 "<HR>Weitere Artikel zu diesem Thema:"
202 + "<PRE>" + t[info[TID], 1] + "</PRE><HR>" : "")
203 + " ["+(article < sizeof(tmp)-1 ? make_link(next, group,to_string(article+1)) :
204 next)+"]"
205 + " ["+(article ? make_link(prev, group, to_string(article-1)) : prev)+"]"
206 + " ["+make_link("Artikel&uuml;bersicht", group)+"]"
207 + " ["+make_link("Gruppen&uuml;bersicht")+"]";
208}
209
210string Request(mapping cmds)
211{
212 string text;
213 if(!cmds[GROUP]) text = GroupList();
214 else
215 if(!cmds[ARTICLE]) text = ArticleList(cmds[GROUP]);
216 else text = Message(cmds[GROUP], cmds[ARTICLE]);
217
218 return "<H2>"+MUDNAME+" Zeitung</H2><HR>"
219 +text;
220}