User: من یک کد برایت میفرستم بعد میخواهم مثل این کد برایم کد دیگری بنویسی: require "import"
crypt = require "crypt"
json = require "cjson"
import "java.io.*"
import "com.androlua.*"
import "android.graphics.Bitmap"
import "android.widget.*"
import "android.view.*"

-- فایل برای ذخیره تنظیمات
local PREFS_FILE = "/sdcard/mahmoodhhh/preferences.json"

-- تابع برای ذخیره تنظیمات
function savePreferences(selectedOption, apiKey, showOptions, displayedOptions)
    local prefs = {
        selectedOption = selectedOption,
        apiKey = apiKey,
        showOptions = showOptions,
        displayedOptions = displayedOptions
    }
    local file = io.open(PREFS_FILE, "w")
    if file then
        file:write(json.encode(prefs))
        file:close()
    end
end

-- تابع برای بارگیری تنظیمات
function loadPreferences()
    local file = io.open(PREFS_FILE, "r")
    if file then
        local content = file:read("*all")
        file:close()
        local prefs = json.decode(content)
        return prefs or {
            selectedOption = -1,
            apiKey = "",
            showOptions = true,
            displayedOptions = {
                recognizeOption = true,
                apiKey = true
            }
        }
    end
    return nil
end

-- تابع برای پاک کردن همه تنظیمات
function clearAllSettings()
    os.remove(PREFS_FILE)
    Toast.makeText(this, "همه تنظیمات پاک شد", Toast.LENGTH_SHORT).show()
end

-- تابع برای پردازش تصویر با استفاده از API آنتی کپچا
function processImage(base64Image, apiKey)
    local anti_captcha_api_url = "https://api.anti-captcha.com/createTask"

    local headers = {
        ["Content-Type"] = "application/json"
    }

    local requestBody = json.encode({
        clientKey = apiKey,
        task = {
            type = "ImageToTextTask",
            body = base64Image,
            phrase = false,
            caseSensitive = false,
            numeric = false,
            math = false,
            minLength = 1,
            maxLength = 0
        }
    })

    Http.post(anti_captcha_api_url, requestBody, headers, function(status, body)
        if status == 200 then
            local response = json.decode(body)
            if response.errorId == 0 then
                local taskId = response.taskId
                -- بررسی API برای دریافت نتیجه
                pollTaskResult(taskId, apiKey)
            else
                print("خطا در درخواست API: " .. response.errorDescription)
                this.speak("خطا در درخواست API: " .. response.errorDescription)
            end
        else
            print("خطا در درخواست API: " .. status)
            this.speak("خطا در درخواست API")
        end
    end)
end
-- تابع برای دریافت موجودی API
function getApiBalance(apiKey)
    local anti_captcha_api_url = "https://api.anti-captcha.com/getBalance"

    local headers = {
        ["Content-Type"] = "application/json"
    }

    local requestBody = json.encode({
        clientKey = apiKey
    })

    Http.post(anti_captcha_api_url, requestBody, headers, function(status, body)
        if status == 200 then
            local response = json.decode(body)
            if response.errorId == 0 then
                local balance = response.balance
                print("موجودی API به دلار: " .. balance)
                print("برای خرید اعتبار به وبسایت https://acaptcha.ir مراجعه کنید.")
            else
                print("خطا در درخواست API: " .. response.errorDescription)
                this.speak("خطا در درخواست API: " .. response.errorDescription)
            end
        else
            print("خطا در درخواست API: " .. status)
            this.speak("خطا در درخواست API")
        end
    end)
end

-- تابع برای بررسی نتیجه تسک از API آنتی کپچا
function pollTaskResult(taskId, apiKey)
    local anti_captcha_api_url = "https://api.anti-captcha.com/getTaskResult"

    local headers = {
        ["Content-Type"] = "application/json"
    }

    local requestBody = json.encode({
        clientKey = apiKey,
        taskId = taskId
    })

    Http.post(anti_captcha_api_url, requestBody, headers, function(status, body)
        if status == 200 then
            local response = json.decode(body)
            if response.errorId == 0 then
                if response.status == "ready" then
                    local content = response.solution.text
                    -- نمایش نتیجه بدون ترجمه
                    print(content)
                    this.speak(content)
                    -- کپی نتیجه در کلیپبورد
                    service.copy(content)
                    -- دریافت و نمایش موجودی API
                    getApiBalance(apiKey)
                else
                    -- بررسی مجدد بعد از تاخیر
                    task(5000, function()
                        pollTaskResult(taskId, apiKey)
                    end)
                end
            else
                print("خطا در درخواست API: " .. response.errorDescription)
                this.speak("خطا در درخواست API: " .. response.errorDescription)
            end
        else
            print("خطا در درخواست API: " .. status)
            this.speak("خطا در درخواست API")
        end
    end)
end

-- تابع برای اطمینان از وجود دایرکتوری
function ensureDirectoryExists(directoryPath)
    local dir = File(directoryPath)
    if not dir.exists() then
        dir.mkdirs()
    end
end

-- تابع برای تولید نام یکتا برای تصویر
function generateImageName()
    local timestamp = os.time()
    local randomNum = math.random(1000, 9999)
    return string.format("image_%d_%d.jpg", timestamp, randomNum)
end

-- تابع برای گرفتن و پردازش تصویر از طریق API
function captureAndProcessImage(focus, apiKey)
    local directoryPath = focus == 1 and "/sdcard/mahmoodhhh/obj" or "/sdcard/mahmoodhhh/prints"

    ensureDirectoryExists(directoryPath)

    local imageName = generateImageName()
    local imagePath = directoryPath .. "/" .. imageName

    local screenCaptureFunc = function(bmp)
        bmp.compress(Bitmap.CompressFormat.JPEG, 90, FileOutputStream(File(imagePath)))
        this.speak("در حال پردازش تصویر، لطفا صبر کنید.")
        task(300, function()
            local fl = io.open(imagePath, "rb")
            local tfl = fl:read("*a")
            fl:close()
            local base64Image = crypt.base64encode(tfl)
            processImage(base64Image, apiKey)
            -- حذف تصویر بعد از پردازش
            os.remove(imagePath)
        end)
    end

    if focus == 1 then
        task(80, function()
            this.getScreenShot(node, {onScreenCaptureDone = screenCaptureFunc})
        end)
    else
        task(80, function()
            this.getScreenShot({onScreenCaptureDone = screenCaptureFunc})
        end)
    end
end

-- تابع برای نمایش گزینه‌های دیالوگ با گزینه API کی
function showOptionsDialog(savedPrefs)
    local layout = {
        LinearLayout,
        orientation="vertical",
        padding="16dp",
        {
            RadioGroup,
            id="optionsGroup",
            {
                RadioButton,
                id="option1",
                text="شناسایی مورد انتخاب شده"
            },
            {
                RadioButton,
                id="option2",
                text="شناسایی تمام صفحه"
            }
        },
        {
            EditText,
            id="apiKeyInput",
            hint="API کی را وارد کنید",
            layout_width="match_parent"
        },
        {
            CheckBox,
            id="saveAsDefaultCheckbox",
            text="ذخیره به عنوان پیش‌فرض",
            checked=false
        },
        {
            CheckBox,
            id="showOptionsCheckbox",
            text="نمایش گزینه‌ها در بار بعد",
            checked=true
        },
        {
            Button,
            id="clearSettingsButton",
            text="پاک کردن همه تنظیمات",
            layout_width="match_parent",
            layout_marginTop="16dp"
        }
    }

    local dialog_view = loadlayout(layout)
    local optionsGroup = dialog_view.findViewById(dialog_view.getChildAt(0).getId())
    local option1 = dialog_view.findViewById(dialog_view.getChildAt(0).getChildAt(0).getId())
    local option2 = dialog_view.findViewById(dialog_view.getChildAt(0).getChildAt(1).getId())
    local apiKeyInput = dialog_view.findViewById(dialog_view.getChildAt(1).getId())
    local saveAsDefaultCheckbox = dialog_view.findViewById(dialog_view.getChildAt(2).getId())
    local showOptionsCheckbox = dialog_view.findViewById(dialog_view.getChildAt(3).getId())
    local clearSettingsButton = dialog_view.findViewById(dialog_view.getChildAt(4).getId())

    -- تنظیم مقادیر اولیه بر اساس تنظیمات ذخیره شده
    if savedPrefs then
        if savedPrefs.selectedOption == 1 then
            option1.setChecked(true)
        elseif savedPrefs.selectedOption == 2 then
            option2.setChecked(true)
        end
        apiKeyInput.setText(savedPrefs.apiKey or "")
        showOptionsCheckbox.setChecked(savedPrefs.showOptions)
    end

    local dialog = LuaDialog(this)
    dialog.setTitle("گزینه‌های آنتی کپچا")
    dialog.setView(dialog_view)

    -- تنظیم دکمه پاک کردن تنظیمات
    clearSettingsButton.setOnClickListener{
        onClick = function()
            clearAllSettings()
            dialog.dismiss()
            showOptionsDialog(nil)  -- باز کردن مجدد دیالوگ با تنظیمات پیش‌فرض
        end
    }

    dialog.setPositiveButton("ادامه", function()
        local selectedOption = optionsGroup.getCheckedRadioButtonId()
        local apiKey = apiKeyInput.getText().toString()
        local saveAsDefault = saveAsDefaultCheckbox.isChecked()
        local showOptions = showOptionsCheckbox.isChecked()

        local optionNumber
        if selectedOption == option1.getId() then
            optionNumber = 1
        elseif selectedOption == option2.getId() then
            optionNumber = 2
        else
            Toast.makeText(this, "لطفا یک گزینه را انتخاب کنید", Toast.LENGTH_SHORT).show()
            return
        end

        -- اگر "نمایش گزینه‌ها در بار بعد" انتخاب شده باشد، کاربر را برای انتخاب گزینه‌های نمایش داده شود
        if showOptions then
            showDisplayOptionsDialog(optionNumber, apiKey, saveAsDefault)
        else
            -- ذخیره تنظیمات اگر "ذخیره به عنوان پیش‌فرض" انتخاب شده باشد
            if saveAsDefault then
                savePreferences(optionNumber, apiKey, showOptions, savedPrefs and savedPrefs.displayedOptions or {
                    recognizeOption = true,
                    apiKey = true
                })
            end

            captureAndProcessImage(optionNumber, apiKey)
        end
    end)

    dialog.setNegativeButton("لغو", nil)
    dialog.show()
end

-- تابع برای نمایش دیالوگ برای انتخاب گزینه‌های نمایش
function showDisplayOptionsDialog(selectedOption, apiKey, saveAsDefault)
    local layout = {
        LinearLayout,
        orientation="vertical",
        padding="16dp",
        {
            TextView,
            text="گزینه‌هایی را که می‌خواهید در بار بعد نمایش داده شود انتخاب کنید:",
            layout_marginBottom="8dp"
        },
        {
            CheckBox,
            id="displayRecognizeOptionCheckbox",
            text="گزینه شناسایی",
            checked=true
        },
        {
            CheckBox,
            id="displayApiKeyCheckbox",
            text="API کی",
            checked=true
        }
    }

    local dialog_view = loadlayout(layout)
    local displayRecognizeOptionCheckbox = dialog_view.findViewById(dialog_view.getChildAt(1).getId())
    local displayApiKeyCheckbox = dialog_view.findViewById(dialog_view.getChildAt(2).getId())

    local dialog = LuaDialog(this)
    dialog.setTitle("گزینه‌های نمایش")
    dialog.setView(dialog_view)

    dialog.setPositiveButton("ذخیره", function()
        local displayedOptions = {
            recognizeOption = displayRecognizeOptionCheckbox.isChecked(),
            apiKey = displayApiKeyCheckbox.isChecked()
        }

        -- ذخیره تنظیمات
        if saveAsDefault then
            savePreferences(selectedOption, apiKey, true, displayedOptions)
        end

        captureAndProcessImage(selectedOption, apiKey)
    end)

    dialog.setNegativeButton("لغو", nil)
    dialog.show()
end

-- تابع برای اجرای انتخاب کاربر بلافاصله
function executeUserChoice(prefs)
    captureAndProcessImage(prefs.selectedOption, prefs.apiKey)
end

-- اطمینان از وجود دایرکتوری تنظیمات
ensureDirectoryExists("/sdcard/mahmoodhhh")

-- اجرای اصلی
local savedPrefs = loadPreferences()
if savedPrefs and not savedPrefs.showOptions then
    -- اگر تنظیمات وجود داشته باشد و showOptions غیرفعال باشد، انتخاب کاربر را بلافاصله اجرا کن
    executeUserChoice(savedPrefs)
else
    -- اگر تنظیمات وجود نداشته باشد یا showOptions فعال باشد، دیالوگ گزینه‌ها را نمایش ده
    showOptionsDialog(savedPrefs)
end حالا میخواهم کدی بنویسی که پس از اجرا با استفاده از دستور زیر آخرین گفته نرم افزار را در متغیر text قرار دهد: text=service.getLastSpeakText() بعد در متغیر به دنبال کلمه رمز بگردد و اگر کلمه را پیدا کرد ۷ عدد بعد از آن را با استفاده از دستور service.copy در کلیپبورد کپی کند.
Assistant: برای نوشتن کدی که پس از اجرا، آخرین گفتار نرم‌افزار را در متغیر `text` قرار دهد و سپس به دنبال کلمه "رمز" بگردد و ۷ عدد بعد از آن را در کلیپبورد کپی کند، می‌توانید از کد زیر استفاده کنید:

```lua
-- تابع برای دریافت آخرین متن گفتاری
function getLastSpeakTextAndCopy()
    -- دریافت آخرین متن گفتاری
    local text = service.getLastSpeakText()

    -- جستجو برای کلمه "رمز"
    local startIndex = string.find(text, "رمز")
    if startIndex then
        -- محاسبه موقعیت شروع عدد بعد از کلمه "رمز"
        local numberStartIndex = startIndex + #("رمز") + 1  -- +1 برای فاصله بعد از "رمز"
        
        -- استخراج ۷ عدد بعد از کلمه "رمز"
        local number = string.sub(text, numberStartIndex, numberStartIndex + 6)  -- ۷ عدد
        
        -- اگر عدد پیدا شد، در کلیپبورد کپی کن
        if #number == 7 then
            service.copy(number)
            print("عدد کپی شد: " .. number)
        else
            print("عدد کافی پیدا نشد.")
        end
    else
        print("کلمه 'رمز' پیدا نشد.")
    end
end

-- اجرای تابع
getLastSpeakTextAndCopy()
```

### توضیحات کد:

1. **دریافت آخرین متن گفتاری**: با استفاده از `service.getLastSpeakText()` آخرین متن گفتاری را در متغیر `text` ذخیره می‌کنیم.

2. **جستجو برای کلمه "رمز"**: با استفاده از `string.find` به دنبال کلمه "رمز" می‌گردیم. اگر این کلمه پیدا شد، موقعیت آن را در متغیر `startIndex` ذخیره می‌کنیم.

3. **محاسبه موقعیت شروع عدد**: موقعیت شروع عدد بعد از کلمه "رمز" را محاسبه می‌کنیم.

4. **استخراج ۷ عدد بعد از کلمه "رمز"**: با استفاده از `string.sub`، ۷ عدد بعد از کلمه "رمز" را استخراج می‌کنیم.

5. **کپی عدد به کلیپبورد**: اگر عدد پیدا شد و طول آن برابر با ۷ بود، آن را در کلیپبورد کپی می‌کنیم.

شما می‌توانید این کد را در پروژه خود قرار دهید و آن را اجرا کنید.
User: لطفا کد را کامل بنویس و import ها را هم بنویس تا کپی کنم
Assistant: