72 lines
1.7 KiB
Go
72 lines
1.7 KiB
Go
package twitter
|
|
|
|
import (
|
|
"net/http"
|
|
"regexp"
|
|
|
|
"github.com/foxdeveloper/namecheck"
|
|
"github.com/foxdeveloper/namecheck/util"
|
|
)
|
|
|
|
const (
|
|
EndpointAPI string = "https://twitter.com/"
|
|
AvailableHTTPCode int = http.StatusNotFound
|
|
UsernameShort int = 1
|
|
UsernameLong int = 15
|
|
UsernameLegalPattern string = "^[A-Za-z0-9_]+$"
|
|
UsernameIllegalPattern string = "twitter"
|
|
)
|
|
|
|
var (
|
|
legalRegexp = regexp.MustCompile(UsernameLegalPattern)
|
|
illegalRegexp = regexp.MustCompile(UsernameIllegalPattern)
|
|
)
|
|
|
|
type Twitter struct{}
|
|
|
|
func init() {
|
|
namecheck.AddSn(&Twitter{})
|
|
}
|
|
|
|
func (t *Twitter) String() string {
|
|
return "Twitter"
|
|
}
|
|
|
|
// IsValid check the validity of the username
|
|
func (t *Twitter) IsValid(username string) bool {
|
|
return isLongEnough(username) &&
|
|
isShortEnough(username) &&
|
|
containsNoIllegalPattern(username) &&
|
|
containsOnlyLegalChars(username)
|
|
}
|
|
|
|
// IsAvailable check username availability
|
|
func (t *Twitter) IsAvailable(username string) (bool, error) {
|
|
res, err := http.Get(EndpointAPI + username)
|
|
if err != nil {
|
|
myErr := &namecheck.ErrUnknownAvailability{Username: username, Cause: err}
|
|
return false, myErr
|
|
}
|
|
|
|
// Prevent memory leaks
|
|
defer res.Body.Close()
|
|
|
|
return res.StatusCode == AvailableHTTPCode, nil
|
|
}
|
|
|
|
func isLongEnough(username string) bool {
|
|
return util.Counter(username) >= UsernameShort
|
|
}
|
|
|
|
func isShortEnough(username string) bool {
|
|
return util.Counter(username) <= UsernameLong
|
|
}
|
|
|
|
func containsOnlyLegalChars(username string) bool {
|
|
return legalRegexp.MatchString(util.ToLower(username))
|
|
}
|
|
|
|
func containsNoIllegalPattern(username string) bool {
|
|
return len(illegalRegexp.FindStringIndex(util.ToLower(username))) == 0
|
|
}
|