*  @throws IOException if a network error occurs
         *  @since 0.24
         */
        public HashMap<String, Object> getUserInfo() throws IOException
        {
            String info = fetch(query + "list=users&usprop=editcount%7Cgroups%7Crights%7Cemailable%7Cblockinfo%7Cgender&ususers="
                + URLEncoder.encode(username, "UTF-8"), "getUserInfo");
            HashMap<String, Object> ret = new HashMap<String, Object>(10);

            // blocked
            ret.put("blocked", info.contains("blockedby=\""));

            // emailable
            ret.put("emailable", info.contains("emailable=\""));

            // edit count
            int a = info.indexOf("editcount=\"") + 11;
            int b = info.indexOf('\"', a);
            ret.put("editcount", Integer.parseInt(info.substring(a, b)));

            // gender
            a = info.indexOf("gender=\"") + 8;
            b = info.indexOf('\"', a);
            ret.put("gender", Wiki.Gender.valueOf(info.substring(a, b)));

            // groups
            ArrayList<String> temp = new ArrayList<String>(50);
            for (int x = info.indexOf("<g>"); x >= 0; x = info.indexOf("<g>", x))
            {
                int y = info.indexOf("</g>", x);
                temp.add(info.substring(x + 3, y));
                x = y;
            }
            String[] temp2 = temp.toArray(new String[0]);
            // cache
            if (this.equals(getCurrentUser()))
                groups = temp2;
            ret.put("groups", temp2);

            // rights
            temp.clear();
            for (int x = info.indexOf("<r>"); x >= 0; x = info.indexOf("<r>", x))
            {
                int y = info.indexOf("</r>", x);
                temp.add(info.substring(x + 3, y));
                x = y;
            }
            temp2 = temp.toArray(new String[0]);
            // cache
            if (this.equals(getCurrentUser()))
                rights = temp2;
            ret.put("rights", temp2);
            return ret;
        }