]> Git repositories of Nishi - okuu.git/commitdiff
can post in news now
authorNishi <nishi@nishi.boats>
Wed, 11 Sep 2024 00:26:25 +0000 (00:26 +0000)
committerNishi <nishi@nishi.boats>
Wed, 11 Sep 2024 00:26:25 +0000 (00:26 +0000)
git-svn-id: file:///raid/svn-personal/okuu/trunk@5 7d206d2a-66c2-044b-96de-ba755a9b3ba8

Bot/bot.c
Bot/main.c
Bot/news.c
Bot/ok_news.h

index 98fb4ad63ad1dc038c87137312732d4243b8ca89..dda09c3a1322a0d243edd6af28102b40c792866f 100644 (file)
--- a/Bot/bot.c
+++ b/Bot/bot.c
 
 #define OKUU_VERSION "1.00"
 
-extern char* nntpserver;
-extern char* nntpuser;
-extern char* nntppass;
 extern char* nntppath;
 extern char* nntpcount;
-extern int nntpport;
 
 extern char* ircserver;
 extern char* ircchan;
@@ -87,6 +83,14 @@ void ok_bot(void){
        ok_addr.sin_family = PF_INET;
        ok_addr.sin_addr.s_addr = inet_addr(ircserver);
        ok_addr.sin_port = htons(ircport);
+
+       int yes = 1;
+
+       if(setsockopt(ok_sock, IPPROTO_TCP, TCP_NODELAY, (char*)&yes, sizeof(yes)) < 0) {
+               fprintf(stderr, "setsockopt failure");
+               ok_close(ok_sock);
+               return;
+       }
        
        if(connect(ok_sock, (struct sockaddr*)&ok_addr, sizeof(ok_addr)) < 0){
                fprintf(stderr, "Connection failure\n");
@@ -234,6 +238,10 @@ void ok_bot(void){
                                                }
                                        }else if(sentin[0] == '#'){
                                                /* This was sent in channel */
+                                               if(ok_news_write(nick, msg) != 0){
+                                                       sprintf(construct, "PRIVMSG %s :Could not send the message to the USENET", sentin);
+                                                       ircfw_socket_send_cmd(ok_sock, NULL, construct);
+                                               }
                                        }
 
                                        free(nick);
index 9ff8e1e93b2b9d1d61edcf9f859014f1deb0974e..062c4982337b4537b1a1c64b50952d97a6af780f 100644 (file)
@@ -12,6 +12,8 @@ char* nntpserver;
 char* nntpuser;
 char* nntppass;
 char* nntppath;
+char* nntpgroup;
+char* nntpfrom;
 char* nntpcount;
 int nntpport = 119;
 
@@ -30,7 +32,9 @@ int main(){
        nntpuser = getenv("NNTPUSER");
        nntppass = getenv("NNTPPASS");
        nntppath = getenv("NNTPPATH");
+       nntpgroup = getenv("NNTPGROUP");
        nntpcount = getenv("NNTPCOUNT");
+       nntpfrom = getenv("NNTPFROM");
        ircserver = getenv("IRCSERVER");
        ircchan = getenv("IRCCHAN");
        ircuser = getenv("IRCUSER");
@@ -56,6 +60,14 @@ int main(){
                fprintf(stderr, "Set NNTPCOUNT\n");
                bad = true;
        }
+       if(nntpfrom == NULL){
+               fprintf(stderr, "Set NNTPFROM\n");
+               bad = true;
+       }
+       if(nntpgroup == NULL){
+               fprintf(stderr, "Set NNTPGROUP\n");
+               bad = true;
+       }
        if(ircserver == NULL){
                fprintf(stderr, "Set IRCSERVER\n");
                bad = true;
index f5c018f33b305156ec98f3161d84d1ed6813a131..cdc3d269c75d73fa4f63e2dffd12360ea331e977 100644 (file)
 #include <stdint.h>
 #include <sys/stat.h>
 
+#include <sys/socket.h>
+#include <netinet/tcp.h>
+#include <arpa/inet.h>
+
+#ifdef __FreeBSD__
+#include <netinet/in.h>
+#endif
+
+extern char* nntpserver;
+extern char* nntpuser;
+extern char* nntppass;
+extern char* nntppath;
+extern char* nntpfrom;
+extern char* nntpgroup;
+extern char* nntpcount;
+extern int nntpport;
+
 struct news_entry news_entry;
 
+void ok_close(int sock);
+
 void ok_news_init(void){
        news_entry.from = NULL;
        news_entry.content = NULL;
 }
 
 int ok_news_read(const char* path){
-
        if(news_entry.from != NULL){
                free(news_entry.from);
                news_entry.from = NULL;
@@ -203,3 +221,120 @@ int ok_news_read(const char* path){
                return 1;
        }
 }
+
+int ok_news_parse(int sock){
+       char c;
+       int sta = 0;
+       bool st = false;
+       while(1){
+               if(recv(sock, &c, 1, 0) <= 0){
+                       return -1;
+               }
+               if(c == '\n') break;
+               if(!st){
+                       if('0' <= c && c <= '9'){
+                               sta *= 10;
+                               sta += c - '0';
+                       }else if(c == ' '){
+                               st = true;
+                       }
+               }
+       }
+       return sta == 0 ? -1 : sta;
+}
+
+int ok_news_write(const char* nick, const char* message){
+       int nt_sock;
+       struct sockaddr_in nt_addr;
+       if((nt_sock = socket(PF_INET, SOCK_STREAM, 0)) < 0){
+               fprintf(stderr, "Socket creation failure\n");
+               return 1;
+       }
+
+       bzero((char*)&nt_addr, sizeof(nt_addr));
+       nt_addr.sin_family = PF_INET;
+       nt_addr.sin_addr.s_addr = inet_addr(nntpserver);
+       nt_addr.sin_port = htons(nntpport);
+
+       int yes = 1;
+
+       if(setsockopt(nt_sock, IPPROTO_TCP, TCP_NODELAY, (char*)&yes, sizeof(yes)) < 0) {
+               fprintf(stderr, "setsockopt failure");
+               ok_close(nt_sock);
+               return 1;
+       }
+
+       if(connect(nt_sock, (struct sockaddr*)&nt_addr, sizeof(nt_addr)) < 0){
+               fprintf(stderr, "Connection failure\n");
+               ok_close(nt_sock);
+               return 1;
+       }
+
+       int sta;
+
+       sta = ok_news_parse(nt_sock);
+       if(sta == 200 || sta == 201){
+               char construct[1024];
+               if(nntpuser != NULL){
+                       sprintf(construct, "AUTHINFO USER %s\r\n", nntpuser);
+                       send(nt_sock, construct, strlen(construct), 0);
+                       sta = ok_news_parse(nt_sock);
+                       if(sta != 381){
+                               goto cleanup;
+                       }
+               }
+               if(nntppass != NULL){
+                       sprintf(construct, "AUTHINFO PASS %s\r\n", nntppass);
+                       send(nt_sock, construct, strlen(construct), 0);
+                       if(sta != 281){
+                               goto cleanup;
+                       }
+               }
+               send(nt_sock, "MODE READER\r\n", 4 + 1 + 6 + 2, 0);     
+               sta = ok_news_parse(nt_sock);
+               if(sta == 200 || sta == 201){
+                       send(nt_sock, "POST\r\n", 4 + 2, 0);
+                       sta = ok_news_parse(nt_sock);
+                       if(sta == 340){
+                               sprintf(construct, "From: %s\r\n", nntpfrom);
+                               send(nt_sock, construct, strlen(construct), 0);
+                               sprintf(construct, "Newsgroups: %s\r\n", nntpgroup);
+                               send(nt_sock, construct, strlen(construct), 0);
+                               sprintf(construct, "Subject: Message from %s\r\n", nick);
+                               send(nt_sock, construct, strlen(construct), 0);
+                               send(nt_sock, "\r\n", 2, 0);
+                               char c;
+                               int i;
+                               bool first = true;
+                               for(i = 0; message[i] != 0; i++){
+                                       if(message[i] == '\n'){
+                                               send(nt_sock, "\r\n", 2, 0);
+                                               first = true;
+                                       }else{
+                                               if(first && message[i] == '.'){
+                                                       send(nt_sock, message + i, 1, 0);
+                                               }
+                                               send(nt_sock, message + i, 1, 0);
+                                               first = false;
+                                       }
+                               }
+                               if(!first) send(nt_sock, "\r\n", 2, 0);
+                               send(nt_sock, ".\r\n", 3, 0);
+                               sta = ok_news_parse(nt_sock);
+                               if(sta != 240) goto cleanup;
+                       }else{
+                               goto cleanup;
+                       }
+               }else{
+                       goto cleanup;
+               }
+       }else{
+               goto cleanup;
+       }
+
+       ok_close(nt_sock);
+       return 0;
+cleanup:
+       ok_close(nt_sock);
+       return 1;
+}
index a3ed195bf5586655afd5d7cd18cb7c35cab22542..a49dc9d26a0c244cae5327d1a596f3f2be57f2e7 100644 (file)
@@ -10,6 +10,7 @@ struct news_entry {
 
 void ok_news_init(void);
 int ok_news_read(const char* path);
+int ok_news_write(const char* nick, const char* message);
 
 #ifndef OK_NEWS_SRC
 extern struct news_entry news_entry;