/// <summary> /// IRC에 연결합니다. /// </summary> public void Connect() { client = new TcpClient(host, port); stream = client.GetStream(); _ssl = new SslStream(stream, false, new RemoteCertificateValidationCallback(ValidateCert)); _ssl.AuthenticateAsClient("Slack"); reader = new StreamReader(_ssl); writer = new StreamWriter(_ssl); // 정보를 서버에 보내기 send_string(string.Format("PASS {0}", password)); send_string(string.Format("NICK {0}", nickname)); send_string("JOIN BOT"); // 스레드 생성 & 시작 updateThread = new Thread(new ThreadStart(update_target)); timeThread = new Thread(new ThreadStart(time_target)); updateThread.Start(); timeThread.Start(); // C# 인터프리터 출력 이벤트 설정 CSharpRunner.OutputData += CSharpRunner_OutputData; // 관리자 목록 불러오기 AdminManager.Load(); // 파일 모니터링 시작 FileMonitor.Start(); // 파이썬 인터프리터 초기화 & 설정 PythonRunner.Init(); PythonRunner.Print += PythonRunner_Print; // 도움말 로딩 ShowHelp.Load(); ShowHelp.HelpShowed += ShowHelp_HelpShowed; bool quit = false; // 종료 여부 while (!quit) { string readline = Console.ReadLine(); // 콘솔 창에서 입력 받아고기 if (readline != "!quit") { // IRC에 보낸다. SendMessage(readline); } else { // 종료하기 quit = true; SendMessage(channel, "theo5970_bot 봇을 종료합니다."); // 스레드 중단 updateThread.Abort(); timeThread.Abort(); // 자기 자신의 프로세스를 죽이기 Process.GetCurrentProcess().Kill(); break; } } }
private static string py_ch = ""; //파이썬 임시채널 /// <summary> /// 명령어를 처리합니다. /// </summary> /// <param name="nickname">닉네임</param> /// <param name="channel">채널 이름</param> /// <param name="message">메시지</param> private async void process_command(string nickname, string channel, string message) { string command = message.Substring(1); string command_name = command.Split(' ')[0]; string args = command.Substring(command_name.Length).Trim(); switch (command_name) { // 주어진 문자열을 뒤집는다. case "reverse": char[] array_ = args.ToCharArray(); Array.Reverse(array_); SendMessage(channel, new string(array_)); break; // 구구단 출력 case "99": StringBuilder sb = new StringBuilder(); for (int x = 2; x <= 9; x++) { for (int y = 1; y <= 9; y++) { sb.AppendFormat(channel, "{0} x {1} = {2} | ", x, y, x * y); } SendMessage(channel, sb.ToString()); sb.Clear(); } break; // 헬로월드 출력 case "helloworld": SendMessage(channel, "안녕 세상아! Hello, World"); break; // 현재 날짜 / 시간 출력 case "time": SendMessage(channel, string.Format("{0} | {1}", DateTime.Now.ToLongDateString(), DateTime.Now.ToLongTimeString())); break; // 지 혼자 빼애액 거림 case "beep": SendMessage(channel, "빼애애애애애애애애애액!!!"); break; // 명령어 도움말 case "commands": { int n = 0; if (int.TryParse(args.Trim(), out n)) { ShowHelp.Show(channel, Convert.ToInt32(args.Trim())); } else { ShowHelp.Show(channel, 1); } } break; // 10진수 -> 2진수 case "dec2bin": try { SendMessage(channel, Convert.ToString(Convert.ToInt32(args), 2)); } catch { SendMessage(channel, "올바른 정수 값을 입력해주세요. "); } break; // 2진수 -> 10진수 case "bin2dec": try { SendMessage(channel, Convert.ToInt32(args, 2).ToString()); } catch { SendMessage(channel, "올바른 2진수 값을 입력해주세요. "); } break; // 팩토리얼 !n case "fact": BigInteger bi = new BigInteger(1); try { int n = Convert.ToInt32(args); if (n <= 5000 && n > 1) { for (int i = 1; i <= n; i++) { bi *= i; } string result = bi.ToString(); if (result.Length >= 480) { IEnumerable <string> array2 = Split(result, 480); foreach (string str in array2) { SendMessage(channel, str); } } else { SendMessage(channel, result); } } else { SendMessage(channel, "범위에 맞지 않습니다. (1 < n <= 5000)"); } } catch { SendMessage(channel, "올바른 정수 값을 입력해주세요. "); } break; // 피보나치 수열 n번째 항 구하기 case "fibo": BigInteger a = new BigInteger(0); BigInteger b = new BigInteger(1); BigInteger temp = new BigInteger(); try { int n = Convert.ToInt32(args); if (n <= 9999 && n > 1) { for (int i = 1; i <= n; i++) { temp = a; a = b; b = temp + b; temp = 0; } string result = a.ToString(); if (result.Length >= 480) { IEnumerable <string> array1 = Split(result, 480); foreach (string str in array1) { SendMessage(channel, str); } } else { SendMessage(channel, result); } } else { SendMessage(channel, "범위에 맞지 않습니다. (1 < n <= 9999)"); } } catch { SendMessage(channel, "올바른 정수 값을 입력해주세요. "); } break; // 1부터 n까지 더한 값 내보내기 case "sum_n": try { int n = Convert.ToInt32(args); if (n >= 2 && n <= 1000000) { BigInteger e = new BigInteger(); for (int k = 1; k <= n; k++) { e += k; } SendMessage(channel, e.ToString()); } else { SendMessage("범위에 맞지 않습니다. (2 <= n <= 1000000"); } } catch { SendMessage(channel, "올바른 정수 값을 입력해주세요. "); } break; // 원주율 500자리 case "pi": string pi = "3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679821480865132823066470938446095505822317253594081284811174502841027019385211055596446229489549303819644288109756659334461284756482337867831652712019091456485669234603486104543266482133936072602491412737245870066063155881748815209209628292540917153643678925903600113305305488204665213841469519415116094330572703657595919530921861173819326117931051185480744623799627495673518857527248912279381830119491298336733624406566430860213949463952247371907021798609437027705392171762931767523846748184676694051320005681271452635608277857713427577896091736371787214684409012249534301465495853710507922796892589235420199561121290219608640344181598136297747713099605187072113499999983729780499510597317328160963185950244594553469083026425223082533446850352619311881710100031378387528865875332083814206171776691473035982534904287554687311595628638823537875937519577818577805321712268066130019278766111959092164201989380952572010654858632788659361533818279682303019520353018529689957736225994138912497217752834791315155748572424541506959508295331168617278558890750983817546374649393192550604009277016711390098488240128583616035637076601047101819429555961989467678374494482553797747268471040475346462080466842590694912933136770289891521047521620569660240580381501935112533824300355876402474964732639141992726042699227967823547816360093417216412199245863150302861829745557067498385054945885869269956909272107975093029553211653449872027559602364806654991198818347977535663698074265425278625518184175746728909777727938000816470600161452491921732172147723501414419735685481613611573525521334757418494684385233239073941433345477624168625189835694855620992192221842725502542568876717904946016534668049886272327917860857843838279679766814541009538837863609506800642251252051173929848960841284886269456042419652850222106611863067442786220391949450471237137869609563643719172874677646575739624138908658326459958133904780275900994657640789512694683983525957098258226205224894077267194782684826014769909026401363944374553050682034962524517493996514314298091906592509372216964615157098583874105978859597729754989301617539284681382686838689427741559918559252459539594310499725246808459872736446958486538367362226260991246080512438843904512441365497627807977156914359977001296160894416948685558484063534220722258284886481584560285060168427394522674676788952521385225499546667278239864565961163548862305774564980355936345681743241125150760694794510965960940252288"; IEnumerable <string> array = Split(pi, 480); foreach (string str in array) { SendMessage(channel, str); } break; // 유니코드 랜덤 한글문자 500자 출력 case "hang": char c = '\0'; StringBuilder sb2 = new StringBuilder(); for (int i = 0; i < 500; i++) { c = (char)(random.Next(0x2B9F) + 0xAC00 + 1); sb2.Append(c); } IEnumerable <string> array3 = Split(sb2.ToString(), 100); foreach (string str in array3) { SendMessage(channel, str); } break; // 문자열 -> Base64 인코딩 case "b64enc": string tmp = Convert.ToBase64String(Encoding.UTF8.GetBytes(args)); if (tmp.Length > 100) { IEnumerable <string> array4 = Split(tmp, 100); foreach (string str in array4) { SendMessage(channel, str); } } else { SendMessage(channel, tmp); } break; // Base64 인코딩 -> 문자열 case "b64dec": try { string tmp2 = Encoding.UTF8.GetString(Convert.FromBase64String(args)); if (tmp2.Length > 100) { IEnumerable <string> array4 = Split(tmp2, 100); foreach (string str in array4) { SendMessage(channel, str); } } else { SendMessage(channel, tmp2); } } catch { SendMessage("제대로 된 Base64 문자열을 입력해주세요."); } break; // 벤(Ban) case "ban": if (nickname == "theo5970" && args != "theo5970") { if (!banlist.Contains(args)) { banlist.Add(args); SendMessage(channel, "목록에 추가하였습니다."); } else { SendMessage(channel, "이미 있습니다."); } } break; // 벤 풀기(Unban) case "unban": if (nickname == "theo5970") { if (banlist.Contains(args)) { banlist.Remove(args); SendMessage(channel, "벤을 풀었습니다."); } else { SendMessage(channel, "해당 닉네임이 목록에 없습니다."); } } break; // 공지사항 띄우기 case "notice": string notice_msg = string.Format("[{0}님의 공지] {1}", nickname, args); SendMessage(channel, notice_msg); break; // 저장하기 case "save": if (args.Length > 0) { saved = args; SendMessage(channel, "저장을 완료하였습니다"); } else { SendMessage(channel, "0자 이상이어야 합니다."); } break; // 저장한 거 내보내기 case "say": if (saved.Length > 0) { SendMessage(channel, saved); } break; // 엿먹히 case "f**k": SendMessage(channel, "you"); break; // 스톱워치 기능 (시작 / 일시중지 / 중지) case "stopwatch": switch (args.Trim()) { case "start": if (!stopwatch.IsRunning) { stopwatch.Start(); SendMessage(channel, "스톱워치가 시작되었습니다."); } else { SendMessage(channel, "이미 실행중입니다."); } break; case "pause": if (stopwatch.IsRunning) { stopwatch.Stop(); SendMessage(channel, "스톱워치가 일시중지 되었습니다."); SendMessage(channel, string.Format("시간: {0:F3}초", stopwatch.ElapsedMilliseconds / 1000.0)); } else { SendMessage(channel, "스톱워치가 시작되지 않았습니다."); } break; case "stop": stopwatch.Stop(); SendMessage(channel, string.Format("시간: {0:F3}초", stopwatch.ElapsedMilliseconds / 1000.0)); stopwatch.Reset(); SendMessage(channel, "스톱워치가 중지 되었습니다."); break; default: SendMessage(channel, "stopwatch [start/pause/stop]"); SendMessage(channel, "start - 스톱워치를 시작합니다."); SendMessage(channel, "pause - 스톱워치를 일시중지합니다."); SendMessage(channel, "stop - 스톱워치를 중지합니다."); break; } break; // 브레인퍽 인터프리터 case "bf": if (brainfuck == null) { brainfuck = new Brainfuck(); brainfuck.ShutdownRequested += Brainfuck_ShutdownRequested; } bf_ch = channel; try { brainfuck.Run(args.Trim()); } catch (Exception ex) { SendMessage(channel, ex.ToString()); } break; // 망할 ABC 언어 case "abc": SendMessage(channel, ABCDRunner.Run(args.Trim())); break; // C# 인터프리터 case "cs": if (AdminManager.Contains(nickname)) { if (!CSharpRunner.filter_list.Any(s => args.Contains(s))) { cs_ch = channel; CSharpRunner.Input(args.Trim()); } else { SendMessage(channel, "보안을 위해 해당 코드는 무시됩니다."); } } else { SendMessage(channel, "권한이 없습니다."); } break; // 관리자 주기 case "op": string _nickname = args.Trim(); if (AdminManager.Contains(nickname)) { if (!AdminManager.Add(_nickname)) { SendMessage(channel, "목록에 이미 존재합니다."); } else { SendMessage(channel, "관리자 목록에 추가하였습니다."); } } else { SendMessage(channel, "권한이 없습니다."); } break; // 관리자 해제하기 case "deop": _nickname = args.Trim(); if (AdminManager.Contains(nickname)) { if (nickname != _nickname) { if (!AdminManager.Remove(_nickname)) { SendMessage(channel, "목록에 존재하지 않습니다."); } else { SendMessage(channel, "목록에서 삭제했습니다."); } } else { SendMessage(channel, "자기 자신을 삭제할 수 없습니다."); } } else { SendMessage(channel, "권한이 없습니다."); } break; // 파이썬 인터프리터 case "py": py_ch = channel; args = args.Trim(); switch (args) { case "run": PythonRunner.Run(nickname); break; case "reset": PythonRunner.Reset(); break; case "clear": PythonRunner.Clear(nickname); break; default: PythonRunner.Add(nickname, args); break; } break; } // 명령어가 아무 것도 없을 때 if (command_name.Length == 0) { SendMessage(channel, "-- theo5970의 봇입니다 --"); SendMessage(channel, "!commands - 명령어 목록 보기"); } await Task.Delay(1); }