package org.limewire.core.impl.friend; import java.net.InetAddress; import java.util.Collections; import java.util.Map; import org.limewire.core.settings.SearchSettings; import org.limewire.friend.api.Friend; import org.limewire.friend.api.FriendPresence; import org.limewire.friend.api.IncomingChatListener; import org.limewire.friend.api.MessageReader; import org.limewire.friend.api.MessageWriter; import org.limewire.friend.api.Network; import org.limewire.friend.api.PresenceEvent; import org.limewire.io.Address; import org.limewire.io.Connectable; import org.limewire.io.IpPort; import org.limewire.listener.EventListener; import org.limewire.util.ByteUtils; import org.limewire.util.Objects; import com.limegroup.gnutella.PushEndpoint; class GnutellaFriend implements Friend { private final Address address; private final FriendPresence presence; private static final String UNKNOWN_ADDRESS_DESCRIPTION = "Unknown"; private static final String[] adjs = { "Almond", "Brass", "Apricot", "Aqua", "Asparagus", "Tangerine", "Awesome", "Banana", "Bear", "Bittersweet", "Fast", "Blue", "Bell", "Gray", "Green", "Violet", "Red", "Pink", "Orange", "Sienna", "Cool", "Earthy", "Caribbean", "Elder", "Pink", "Cerise", "Cerulean", "Chestnut", "Copper", "Better", "Candy", "Cranberry", "Dandelion", "Denim", "Gray", "Sand", "Desert", "Eggplant", "Lime", "Electric", "Famous", "Fern", "Forest", "Fuchsia", "Fuzzy", "Tree", "Gold", "Apple", "Smith", "Magenta", "Indigo", "Jazz", "Berry", "Jam", "Jungle", "Lemon", "Cold", "Lavender", "Hot", "New", "Ordinary", "Magenta", "Frowning", "Mint", "Mahogany", "Pretty", "Strange", "Grumpy", "Itchy", "Maroon", "Melon", "Midnight", "Clumsy", "Better", "Smiling", "Navy", "Neon", "Olive", "Orchid", "Outer", "Tame", "Cheerful", "Peach", "Periwinkle", "Pig", "Pine", "Nutty", "Plum", "Purple", "Rose", "Salmon", "Scarlet", "Nice", "Jolly", "Great", "Silver", "Sky", "Spring", "Long", "Glow", "Set", "Happy", "Tan", "Thistle", "Timber", "Tough", "Torch", "Smart", "Funny", "Tropical", "Tumble", "Ultra", "White", "Wild", "Yellow", "Eager", "Joyous", "Jumpy", "Kind", "Lucky", "Meek", "Nifty", "Adorable", "Aggressive", "Alert", "Attractive", "Average", "Bright", "Fragile", "Graceful", "Handsome", "Light", "Long", "Misty", "Muddy", "Plain", "Poised", "Precious", "Shiny", "Sparkling", "Stormy", "Wide", "Alive", "Annoying", "Better", "Brainy", "Busy", "Clever", "Clumsy", "Crazy", "Curious", "Easy", "Famous", "Frail", "Gifted", "Important", "Innocent", "Modern", "Mushy", "Odd", "Open", "Powerful", "Real", "Shy", "Sleepy", "Super", "Tame", "Tough", "Vast", "Wild", "Wrong", "Annoyed", "Anxious", "Crazy", "Dizzy", "Dull", "Evil", "Foolish", "Frantic", "Grieving", "Grumpy", "Helpful", "Hungry", "Lazy", "Lonely", "Scary", "Tense", "Weary", "Worried", "Brave", "Calm", "Charming", "Magic", "Easer", "Elated", "Enchanting", "Excited", "Fair", "Fine", "Friendly", "Funny", "Gentle", "Good", "Happy", "Healthy", "Jolly", "Kind", "Lovely", "Nice", "Perfect", "Proud", "Silly", "Smiling", "Thankful", "Witty", "Zany", "Big", "Fat", "Great", "Huge", "Immense", "Puny", "Scrawny", "Short", "Small", "Tall", "Teeny", "Tiny", "Faint", "Harsh", "Loud", "Melodic", "Mute", "Noisy", "Quiet", "Raspy", "Soft", "Whispering", "Ancient", "Fast", "Late", "Long", "Modern", "Old", "Quick", "Rapid", "Short", "Slow", "Swift", "Bitter", "Fresh", "Ripe", "Rotten", "Salty", "Sour", "Spicy" }; private static final String[] nouns = { "Alligator", "Alpaca", "Antelope", "Badger", "Armadillo", "Bat", "Bear", "Bee", "Bird", "Bison", "Buffalo", "Boar", "Butterfly", "Camel", "Cat", "Cattle", "Cow", "Chicken", "Clam", "Cockroach", "Codfish", "Coyote", "Crane", "Crow", "Deer", "Dinosaur", "Velociraptor", "Dog", "Dolphin", "Donkey", "Dove", "Duck", "Eagle", "Eel", "Elephant", "Elk", "Emu", "Falcon", "Ferret", "Fish", "Finch", "Fly", "Fox", "Frog", "Gerbil", "Giraffe", "Gnat", "Gnu", "Goat", "Goose", "Gorilla", "Grasshopper", "Grouse", "Gull", "Hamster", "Hare", "Hawk", "Hedgehog", "Heron", "Hornet", "Hog", "Horse", "Hound", "Hummingbird", "Hyena", "Jay", "Jellyfish", "Kangaroo", "Koala", "Lark", "Leopard", "Lion", "Llama", "Mallard", "Mole", "Monkey", "Moose", "Mosquito", "Mouse", "Mule", "Nightingale", "Opossum", "Ostrich", "Otter", "Owl", "Ox", "Oyster", "Panda", "Parrot", "Peafowl", "Penguin", "Pheasant", "Pig", "Pigeon", "Platypus", "Porpoise", "PrarieDog", "Pronghorn", "Quail", "Rabbit", "Raccoon", "Rat", "Raven", "Reindeer", "Rhinoceros", "Seal", "Seastar", "Serval", "Shark", "Sheep", "Skunk", "Snake", "Snipe", "Sparrow", "Spider", "Squirrel", "Swallow", "Swan", "Termite", "Tiger", "Toad", "Trout", "Turkey", "Turtle", "Wallaby", "Walrus", "Wasp", "Weasel", "Whale", "Wolf", "Wombat", "Woodpecker", "Wren", "Yak", "Zebra", "Ball", "Bed", "Book", "Bun", "Can", "Cake", "Cap", "Car", "Cat", "Day", "Fan", "Feet", "Hall", "Hat", "Hen", "Jar", "Kite", "Man", "Map", "Men", "Panda", "Pet", "Pie", "Pig", "Pot", "Sun", "Toe", "Apple", "Armadillo", "Banana", "Bike", "Book", "Clam", "Mushroom", "Clover", "Club", "Corn", "Crayon", "Crown", "Crib", "Desk", "Dress", "Flower", "Fog", "Game", "Hill", "Home", "Hornet", "Hose", "Joke", "Juice", "Mask", "Mice", "Alarm", "Bath", "Bean", "Beam", "Camp", "Crook", "Deer", "Dock", "Doctor", "Frog", "Good", "Jam", "Face", "Honey", "Kitten", "Fruit", "Fuel", "Cable", "Calculator", "Circle", "Guitar", "Bomb", "Border", "Apparel", "Activity", "Desk", "Art", "Colt", "Cyclist", "Biker", "Blogger", "Anchoby", "Carp", "Glassfish", "Clownfish", "Barracuda", "Eel", "Moray", "Stingray", "Flounder", "Swordfish", "Marlin", "Pipefish", "Grunter", "Grunion", "Grouper", "Guppy", "Gulper", "Crab", "Lobster", "Halibut", "Hagfish", "Horsefish", "Seahorse", "Jellyfish", "Killifish", "Trout", "Pike", "Ray", "Razorfish", "Ragfish", "Hamster", "Gerbil", "Mouse", "Gnome", "Shark", "Snail", "Skilfish" }; public GnutellaFriend(Address address, FriendPresence presence) { this.address = Objects.nonNull(address, "address"); this.presence = presence; } Address getAddress() { return address; } private String describe(Address address) { if(address instanceof Connectable || address instanceof PushEndpoint) { IpPort ipp = (IpPort)address; InetAddress inetAddr = ipp.getInetAddress(); return inetAddr == null ? ipp.getAddress() : inetAddr.getHostAddress(); } else { return address.getAddressDescription(); } } private String describeFriendly(Address address) { if(!SearchSettings.FRIENDLY_ADDRESS_DESCRIPTIONS.getValue()) { return describe(address); } else if(address instanceof Connectable || address instanceof PushEndpoint) { // Convert IP addr into a #. IpPort ipp = (IpPort)address; InetAddress inetAddr = ipp.getInetAddress(); if(inetAddr == null) { return UNKNOWN_ADDRESS_DESCRIPTION; } byte[] addr = inetAddr.getAddress(); if (addr.length != 4) { return UNKNOWN_ADDRESS_DESCRIPTION; } //create a fake name int i1 = ByteUtils.ubyte2int(addr[0]); int i2 = ByteUtils.ubyte2int(addr[1]); int i3 = ByteUtils.ubyte2int(addr[2]); int i4 = ByteUtils.ubyte2int(addr[3]); return adjs[i1] + nouns[i2] + "-" + i3 + "-" + i4; } else { return address.getAddressDescription(); } } @Override public boolean isAnonymous() { return true; } @Override public String getId() { return presence.getPresenceId(); } @Override public String getName() { return describe(address); } @Override public String getRenderName() { return describeFriendly(address); } @Override public void setName(String name) { } @Override public Network getNetwork() { return null; } @Override public String getFirstName() { return getName(); } @Override public void addPresenceListener(EventListener<PresenceEvent> presenceListener) { } @Override public MessageWriter createChat(MessageReader reader) { return null; } @Override public void setChatListenerIfNecessary(IncomingChatListener listener) { } @Override public void removeChatListener() { } @Override public FriendPresence getActivePresence() { return null; } @Override public boolean hasActivePresence() { return false; } @Override public boolean isSignedIn() { return false; } @Override public Map<String, FriendPresence> getPresences() { return Collections.singletonMap(presence.getPresenceId(), presence); } @Override public boolean isSubscribed() { return false; } @Override public String toString() { return "renderName[" + getRenderName() + "], name[" + getName() + "], id[" + getId() + "]"; } }