স্ট্যাক এক্সচেঞ্জের চ্যাটরুমগুলির জন্য একটি চ্যাটবোট তৈরি করুন


39

চ্যালেঞ্জ

এই চ্যালেঞ্জের লক্ষ্য হ'ল একটি চ্যাটবট তৈরি করা যা স্ট্যাক এক্সচেঞ্জের চ্যাটরুমগুলিতে চলতে পারে। আপনার বটকে যখন নির্দিষ্ট ব্যবহারকারীর দ্বারা নির্দিষ্ট আদেশগুলি পোস্ট করা হয় এবং এটিতে প্রতিক্রিয়া জানানো হয় তা সনাক্ত করতে সক্ষম হওয়া দরকার। এটি আদেশগুলির তালিকা এবং আপনার বটটি কী করবে:

  • !!newest: এই সাইটে পোস্ট করা নতুন প্রশ্নের শিরোনাম (কোনও লিঙ্ক নয়, তবে শিরোনাম) আউটপুট করুন (কোডগলফ.এসই)।
  • !!metanewest: মেটা সাইটে পোস্ট করা নতুন প্রশ্নের শিরোনাম আউটপুট (meta.codegolf.SE)।
  • !!questioncount: বর্তমান প্রশ্ন গণনা আউটপুট।
  • !!metaquestioncount: মেটা সাইটে বর্তমান প্রশ্ন গণনা আউটপুট।
  • !!tag tagname: প্রথম পরামিতি হিসাবে দেওয়া ট্যাগের ট্যাগ টুকরা (সংক্ষিপ্ত বিবরণ) আউটপুট।
  • !!metatag tagname: উপরের মত একই, তবে মেটা সাইটের জন্য।
  • !!featured: বর্তমানে একটি অনুগ্রহ রয়েছে এমন প্রশ্নের গণনা আউটপুট করুন।
  • !!metafeatured: মেটাতে [বৈশিষ্ট্যযুক্ত] ট্যাগ থাকা প্রশ্নের গণনা আউটপুট করুন ।

বিধি

  1. আপনার একটি সম্পূর্ণ প্রোগ্রাম লিখতে হবে, একটি স্নিপেট বা ফাংশন নয়।
  2. যদি এটি প্রয়োজনীয় হয় তবে আপনি ইনপুট হিসাবে ব্যবহারকারীর নাম এবং পাসওয়ার্ডের জন্য অনুরোধ করতে পারেন (ইনপুট, এসটিডিআইএন, কমান্ড-লাইন আর্গুমেন্টের জন্য অনুরোধ করা)। আপনি যদি পাইথন বা রুবি ব্যবহার করেন তবে এটি প্রয়োজনীয় হবে, তবে আপনি জাভাস্ক্রিপ্ট ব্যবহার করেন এবং চ্যাট রুমের পৃষ্ঠাতে স্ক্রিপ্টটি চালনা করলে এটি প্রয়োজনীয় হবে না।
  3. ওয়েবসকেটের মতো স্টাফ করার জন্য আপনাকে বাহ্যিক গ্রন্থাগারগুলি ব্যবহার করার অনুমতি দেওয়া হয়েছে। এই লাইব্রেরিতে আপনার অক্ষর গণনার জন্য গণনা করতে হবে না।
  4. আপনি একটি বাহ্যিক চ্যাট র‌্যাপার ব্যবহার করতে পারেন (তবে আপনার নিজের লেখার জন্য উত্সাহ দেওয়া হয় না), এবং তারপরে অক্ষর গণনার জন্য এটি গণনা করতে হবে। আপনাকে মোড়কের কোড পরিবর্তন করার অনুমতি নেই। আপনি যদি এটি ব্যবহার করেন, আপনি এটি পরিবর্তন ছাড়াই ব্যবহার করেন এবং সমস্ত অক্ষর গণনা করতে হবে (এটি আপনার নিজের মোড়ক না লেখার জন্য শাস্তি হিসাবে)।

    কেবল র‍্যাপারের কোডটিই গুনতে হয়। উদাহরণস্বরূপ যদি অন্য ফাইলগুলি থাকে তবে এগুলি গণনা করতে হবে না।

  5. ইউআরএল সংক্ষিপ্তকারী বা অন্যান্য উপায় যা ইউআরএলগুলি সংক্ষিপ্ত করে তুলতে পারে সেগুলির ব্যবহার নয়: চ্যালেঞ্জ হ'ল চ্যাটবোটটি গল্ফ করা, কোনও ইউআরএল গল্ফ নয়।
  6. আড্ডার জবাবদিহি করার জন্য এবং আদেশগুলির প্রতিক্রিয়া জানাতে প্রয়োজনীয় তথ্য পাওয়ার জন্য কোনও ওয়েব অনুরোধ নেই।
  7. ব্যবহারের স্ট্যান্ডার্ড "সমস্যা" অনুমোদিত নয়।
  8. কেউ পোস্ট কমান্ড, আপনি এই বিন্যাসের একটি চ্যাট বার্তা সঙ্গে সাড়া প্রয়োজন: @user response। সুতরাং, আমি যদি আদেশটি লিখি !!featuredএবং এখানে 5 টি বৈশিষ্ট্যযুক্ত প্রশ্ন রয়েছে, আপনার বটটি পোস্ট করা উচিত @ProgramFOX 5
  9. আমি যদি আপনার বট পরীক্ষা করি তবে আমি এটি আমার চ্যাটবোট অ্যাকাউন্ট থেকে চালাব এবং এই চ্যাটরুমে এটি চালাব । আমি সর্বদা সেই ঘরে বটগুলি পরীক্ষা করে দেখব, তাই ইনপুট হিসাবে রুম আইডি সরবরাহ করা প্রয়োজন হয় না, এটি সর্বদা 14697 হবে This এই আইডিটি ইনপুট হিসাবে দেওয়া হবে না, এটি হার্ড-কোডেড হওয়া উচিত।
  10. যদি কমান্ডটি পাওয়া না যায় তবে আউটপুট @user The command [command] does not exist[command]অ-বিদ্যমান কমান্ডের নাম দ্বারা প্রতিস্থাপন করুন । যদি কমান্ডকে যুক্তি সরবরাহ করা হয়, আর্গুমেন্টগুলি আউটপুট করবেন না, কেবল কমান্ডের নাম।
  11. যদি কোনও কমান্ডের অনেকগুলি আর্গুমেন্ট থাকে তবে প্রয়োজনীয় আর্গুমেন্টগুলি উপেক্ষা করুন।
  12. যদি কোনও কমান্ডের পর্যাপ্ত আর্গুমেন্ট না থাকে তবে আউটপুট @user You have not provided enough arguments
  13. সিস্টেমটি প্রতিরোধ করে যে নকল বার্তা স্বল্প সময়ের মধ্যে পোস্ট করা হয়। সুতরাং, আপনার বট পরীক্ষা করার সময়, আমি কখনই দুটি কমান্ড চালাব না যা একই আউটপুটটিকে ধারাবাহিকভাবে দেয় (যার অর্থ আপনার উদাহরণস্বরূপ একটি বিন্দু যুক্ত করে ম্যাসেজগুলি নকল হলে আলাদা করে তোলে এমন একটি সিস্টেম কার্যকর করতে হবে না)।
  14. সিস্টেমটি প্রতিরোধ করে যে খুব বেশি বার্তা স্বল্প সময়ের মধ্যে পোস্ট করা যায়, তাই পরীক্ষা করার সময় আমি কখনই স্বল্প সময়ের মধ্যে খুব বেশি কমান্ড প্রেরণ করব না, যার অর্থ আপনার বটকে এটির যত্ন নিতে হবে না (কিছুক্ষণ অপেক্ষা করে) পোস্ট করার আগে, উদাহরণস্বরূপ)।
  15. এটি , ন্যূনতম পরিমাণে বাইটস সহ প্রোগ্রাম।

শুরু হচ্ছে

আপনার বট লেখার সাথে শুরু করার জন্য এখানে কিছু তথ্য রয়েছে। আপনার এটি ব্যবহার করতে হবে না, তবে এটি একটি গাইডেন্স হতে পারে।

  • লগ ইন করতে, প্রথমে একটি ওপেনআইডি সরবরাহকারীতে লগ ইন করুন। এটি সর্বদা স্ট্যাক এক্সচেঞ্জ ওপেনআইডি ( https://openid.stackexchange.com) থাকবে। লগইন ফর্মটি অবস্থিত https://openid.stackexchange.com/account/login, এবং সেখানে ব্যবহারকারীর নাম এবং পাসওয়ার্ড সরবরাহ করুন।
  • তারপরে, লগইন করুন stackexchange.com। লগইন ফর্মটি অবস্থিত https://stackexchange.com/users/login। ওপেনআইডি সরবরাহকারী হিসাবে স্ট্যাক এক্সচেঞ্জ চয়ন করুন।
  • এটি করার পরে, চ্যাটে লগ ইন করুন। এটির জন্য লগইন ফর্মটি অবস্থিত http://stackexchange.com/users/chat-login। ওপেনআইডি সরবরাহকারী হিসাবে স্ট্যাক এক্সচেঞ্জ চয়ন করুন।
  • তারপরে আপনার নিজের হওয়া দরকার fkey। তার জন্য, যান http://chat.stackexchange.com/chats/join/favoriteএবং fkeyএকটি লুকানো ইনপুট ক্ষেত্র থেকে পান।
  • একটি বার্তা পোস্ট করতে http://chat.stackexchange.com/chats/14697/messages/new, একটি অনুরোধ প্রেরণ করুন , এবং দুটি POST পরামিতি সরবরাহ করুন: textবার্তার পাঠ্যযুক্ত একটি fkeyপরামিতি এবং এতে থাকা একটি প্যারামিটার fkey
  • নতুন বার্তাটি কখন পোস্ট করা হয় তা দেখতে আপনি ওয়েবসকেটগুলি ব্যবহার করতে পারেন (তবে এটির সংক্ষিপ্ত হলে অন্য কিছু ব্যবহার করতে দ্বিধা বোধ করবেন না)। দয়া করে এই মেটা স্ট্যাক এক্সচেঞ্জের উত্তরটি দেখুন :

    চ্যাট

    (wss://chat.sockets.stackexchange.com/events/<roomnumber>/<somehash>?l=<timethingy>)

    রুমের আইডি এবং fkey এ পোস্ট করে হ্যাশটি আনা যায় http://chat.stackexchange.com/ws-auth

    টাইমথিংটি হ'ল জেসন দ্বারা ফিরে আসা সময়ের কী /chats/<roomno>/events

    কোনও বার্তা পোস্ট হওয়ার পরে ইভেন্ট আইডি 1

  • এটা যেমন Doorknob এর মত বিদ্যমান চ্যাট-চাদরে, তাকান দরকারী StackExchange-চ্যাটি এবং Manishearth এর ChatExchange দেখতে কিভাবে এটি ঠিক কাজ করে।

3
আমি শিরোনামটি দেখার মুহুর্তে তাত্ক্ষণিকভাবে "আহ, প্রোগ্রামফক্স" ভেবেছিলাম।
seequ

আমি আশা করছিলাম metafeaturedমেটা নিয়ে উদ্বিগ্ন প্রশ্নগুলির অর্থ হবে তবে ... ধন্যবাদ :-)
জন ডিভোরাক

@ জনডভোরাক পার-সাইট মেটাসের অনুমান নেই, তাই আমি এটি ব্যবহার করতে পারি না। যখন আমি এই চ্যালেঞ্জটি লিখেছিলাম, আমি ভুলে গিয়েছিলাম যে মেটার একটি [বৈশিষ্ট্যযুক্ত] ট্যাগ ছিল, তাই আপনার পরামর্শের জন্য ধন্যবাদ!
প্রোগ্রামফক্স

নতুন বার্তা পোস্ট করা হয়েছিল কিনা তা দেখতে আমি যা করেছি তা জেএসের মাধ্যমে প্রতি 2 সেকেন্ড চেক করা হয়েছিল যদি শেষ বার্তাটি আমার দ্বারা না হয় (শ্রেণিতে শেষ আইটেম)
সিলান

আমাদের ইতিমধ্যে এখানে
মিঃ এলিয়েন

উত্তর:


14

জাভাস্ক্রিপ্ট + jQuery, 1362 1258 বাইট

একটি মিনিফায়ার ব্যবহার করে গল্ফ করা:

$(function(){function e(){function e(e,t){$("#input").val("@"+$(e).parents(".user-container").find(".username").eq(0).text()+" "+t),$("#sayit-button").click()}var i,a=$(t),s=a.map(function(e,t){return t.id}),r=s.slice(-1)[0]
n!=r&&(i=a.slice($.inArray(n,s)+1),n=r,i.map(function(t,n){var i,a,s,r,o,u,c,f=n.textContent.match(/!!(\S+)(?:\s+(\S+))?/)
if(f){switch(i=f[1],a=f[2],s="codegolf",0==i.indexOf("meta")&&(s="meta."+s,i=i.slice(4)),r="?site="+s,c=0,i){case"newest":o=["questions","&order=desc&sort=creation"],u=function(e){return e.items[0].title}
break
case"questioncount":o=["info",""],u=function(e){return e.items[0].total_questions}
break
case"tag":if(!a){c=1
break}o=["tags/"+a+"/wikis",""],u=function(e){return 0==e.items.length?"Tag not found":e.items[0].excerpt}
break
case"featured":o=0==s.indexOf("meta.")?["questions","&tagged=featured"]:["questions/featured",""],u=function(e){var t=e.items.length
return(e.items.has_more?"more than ":"")+t}}c?e(n,"You have not provided enough arguments"):o?$.get("http://api.stackexchange.com/2.2/"+o[0]+r+o[1],function(t){e(n,u(t))}):e(n,"The command "+i+" does not exist")}}))}var t="[id^=message-]",n=$(t).eq(-1).attr("id")
new MutationObserver(e).observe($("#chat").get(0),{childList:!0,subtree:!0})})

আপনাকে সরাসরি ব্রাউজারে স্ক্রিপ্টটি চালাতে হবে (স্ট্যাক এক্সচেঞ্জের jQuery কাজগুলি ব্যবহার করে):

  1. Http://chat.stackexchange.com/rooms/14697/chatbot-challenge-on-programming-pouts-code-golf খুলুন
  2. কনসোলে উপরের কোডটি আটকে দিন
  3. চ্যাটে কিছু কমান্ড লিখুন

এটি আরও অনেক গল্ফ করা যেতে পারে, তবে বিরক্ত করা যায় না।


আন golfed:

$(function() {
    var sel = '[id^=message-]';
    var latestMessage = $(sel).eq(-1).attr('id');
    function update() {
        var messages = $(sel);
        var ids = messages.map(function(i, x) { return x.id; });
        var newest = ids.slice(-1)[0];
        if(latestMessage == newest) {
            return;
        }
        var newMessages = messages.slice($.inArray(latestMessage, ids) + 1);
        latestMessage = newest;
        newMessages.map(function(i, x) {
            var m = x.textContent.match(/!!(\S+)(?:\s+(\S+))?/);
            if(!m) {
                return;
            }
            var c = m[1];
            var a = m[2];
            var s = 'codegolf';
            if(c.indexOf('meta') == 0) {
                s = 'meta.' + s;
                c = c.slice(4);
            }
            var site = '?site=' + s;
            var url;
            var extractor;
            var too_few_args = 0;
            switch(c) {
                case 'newest':
                    var url = ['questions', '&order=desc&sort=creation'];
                    extractor = function(data) {
                        return data.items[0].title;
                    };
                    break;
                case 'questioncount':
                    url = ['info', ''];
                    extractor = function(data) {
                        return data.items[0].total_questions;
                    };
                    break;
                case 'tag':
                    if(!a) {
                        too_few_args = 1;
                        break;
                    }
                    url = ['tags/' + a + '/wikis', ''];
                    extractor = function(data) {
                        if(data.items.length == 0) {
                            return 'Tag not found';
                        }
                        return data.items[0].excerpt;
                    };
                    break;
                case 'featured':
                    url = s.indexOf('meta.') == 0? ['questions', '&tagged=featured']: ['questions/featured', ''];
                    extractor = function(data) {
                        var l = data.items.length;
                        return (data.items.has_more? 'more than ': '') + l;
                    }
                    break;
            }
            if(too_few_args) {
                write(x, 'You have not provided enough arguments');
            } else if(!url) {
                write(x, 'The command ' + c + ' does not exist');
            } else {
                $.get('http://api.stackexchange.com/2.2/' + url[0] + site + url[1], function(data) {
                    write(x, extractor(data));
                });
            }
        });

        function write(x, m) {
            $('#input').val('@' + $(x).parents('.user-container').find('.username').eq(0).text() + ' ' + m);
            $('#sayit-button').click();
        }
    }
    new MutationObserver(update).observe($('#chat').get(0), {childList: true, subtree: true});
});

ভাল, এখানে একটি উত্তর পোস্ট করার জন্য ধন্যবাদ! আমি এখন ঘরে পরীক্ষা চালাচ্ছি। যাইহোক, আমি মনে করি আপনি আরও এক-বর্ণের ভেরিয়েবল ব্যবহার করে এবং এড়িয়ে গিয়ে updateএবং কিছু অক্ষর সংরক্ষণ করতে পারেন latestMessage
প্রোগ্রামফক্স

গ্রেট! আপনি সমস্ত পরীক্ষা পাস করেছেন । কেবলমাত্র অদ্ভুত জিনিসটি আমি লক্ষ্য করেছি যে আপনার বটটি হোমপৃষ্ঠার চেয়ে আলাদা প্রশ্ন গণনা ফিরিয়েছিল, কিন্তু আমি দেখেছি যে এপিআই সেই নম্বরটি ফিরিয়ে দিয়েছে, তাই আমি এটি মেটাতে রিপোর্ট করেছিলাম এবং পরীক্ষার কেসটিকে সঠিক হিসাবে চিহ্নিত করেছি। সাবাশ! +1
প্রোগ্রামফক্স

আমি দেখেছি আপনি বটটি খাটো করে রেখেছেন। নিস! :) আমি এটি পুনরায় পরীক্ষা করেছি এবং আপনি এখনও সমস্ত পরীক্ষায় পাস করেছেন।
ProgramFOX

বরং দেরী, কিন্তু আমি শুধু একটি এক গৃহস্থালির কাজ উন্নতি পাওয়া যায়নি: আপনি প্রতিস্থাপন করতে পারেন 0==e.items.lengthসঙ্গে 1>e.items.lengthকারণ দৈর্ঘ্য শূন্য নীচের যেতে হবে না।
প্রোগ্রামফক্স ২
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.